美文网首页
使用 react-intl 组件/字符串国际化

使用 react-intl 组件/字符串国际化

作者: 郁南 | 来源:发表于2021-02-20 10:43 被阅读0次

    使用 react-intl 串国际化有两种情况:组件和字符串。绝大部分情况都可以使用组件的方式传入ID属性就可以解决需求问题,但遇到无法使用JSX的时候,就只能使用字符串的方式国际化了。

    1、组件国际化

    主要使用FormattedMessage, injectIntl两个API

    1. 封装组件

    // IntlMessages.js
    import React from 'react';
    import { FormattedMessage, injectIntl } from 'react-intl';
    
    const InjectMassage = props => <FormattedMessage {...props} />;
    export default injectIntl(InjectMassage, {
      withRef: false,
    });
    

    2. 使用

    import React from 'react';
    ...
    <Tooltip title={<IntlMessages id={item.id} />} placement="right" />
    

    2、字符串国际化

    这种需求最常见的应该就是input输入框的placeHolder属性无法使用jsx的时候了

    这种不需要额外封装组件,直接使用injectIntl包裹当前组件就可以了。

    // AutocompleteComponent.js
    import React, { useState, useMemo, useRef } from 'react';
    import { injectIntl } from 'react-intl';
    
    import Autocomplete from '@material-ui/lab/Autocomplete';
    
    const AutocompleteComponent = props => {
      console.log(props);
      const {
        intl, // 通过react-intl的高阶函数injectIntl包裹当前组件获取 - 字符串国际化
        intlId,// 国际化对应的id
    ...
      } = props;
    
     return (
          <Autocomplete
              multiple
              freeSolo
              options={[]}
              {...props} 
              onChange={change}
              renderInput={params => (
                <TextField
                  className={classes.autoInput}
                  {...params}
                  {...inputProps}
                  error={isError}
                  placeholder={intl.formatMessage({ id: intlId })}
                  onChange={null}
                  onMouseOver={() => setInputStatus('HOVER')}
                  onMouseLeave={() => setInputStatus('LEAVE')}
                  onFocus={() => setFocus(true)}
                  onBlur={() => setFocus(false)}
                />
              )}
            />
      );
    }
    
    export default injectIntl(AutocompleteComponent);
    

    总结

    1、组件国际化使用组件 IntlMessages
    2、字符串国际化:
    1. 使用 injectIntl包裹当前组件,如injectIntl(Input)
    2. 通过 props 获取 injectIntl传递的intl属性
    3. 使用 intl.formatMessage({ id: intlId })实现国际化
    PS:如果使用了memo等性能优化逻辑,要注意国际化切换的时候也能实时触发intl.formatMessage({ id: intlId })
    如:

    /**
     *  动态计算 placeholder 的展示
     */
        const memoHolder = useMemo(() => {
        const arr = [...filterParams];
        arr.splice(0, values.length);
              return getPlaceHolder(arr, intl);
              // 这里使用了缓存函数usememo,所以切换国际化的时候需要加入 locale 同步触发更新
        }, [values, filterParams, locale]);
    

    相关文章

      网友评论

          本文标题:使用 react-intl 组件/字符串国际化

          本文链接:https://www.haomeiwen.com/subject/owstfltx.html