IntlProvider中的属性变更,并不会触发FormattedMessage重新渲染
解决:在组件中加入key
大型项目不建议使用这种方案,因为:会引起此<IntlProvider>包裹下的所有组件全部被更新

  1. import { FormattedMessage } from 'react-intl';
  2. <FormattedMessage id="common.search" defaultMessage="查询" />
  3. <FormattedMessage id="common.reset" defaultMessage="重置" />
  4. <FormattedMessage id="common.title" defaultMessage="页面标题" />
  5. <Modal
  6. title={<FormattedMessage id="common.add" defaultMessage="新增" />}
  7. visible={visible}
  8. onOk={this.handleOk}
  9. onCancel={this.handleCancel}
  10. >
  11. <Form onSubmit={this.handleSubmit}>
  12. <Item
  13. {...attrs} // 展开多属性
  14. label={<FormattedMessage id="common.department" defaultMessage="部门" />}
  15. />
  16. </Form>
  1. var defaultProps = {
  2. formats: {},
  3. messages: {},
  4. textComponent: 'span',
  5. defaultLocale: 'en',
  6. defaultFormats: {}
  7. };

FormattedMessage常用的属性

  1. id 文件中的属性名,唯一的,重复报错
  2. defaultMessage 中的name和values中的key对应,动态传递参数
    1. 当在locale配置文件中,没有找到这个id的时候,输出的结果就是 defaultMessage的值
  3. tagName 设置生成html标签
  4. description 这个位置替代的字符串的描述,便于维护代码 ```jsx
  1. <a name="g8bG7"></a>
  2. ## FormattedMessage细节
  3. 1. FormattedMessage 用于组件的渲染场景,并不适合用于占位符,替换文本等
  4. 2. placeholder 不能使用 FormattedMessage,实际占位符中返回[Object object],
  5. 1. 因为:FormattedMessage是个组件,对象类型,placeholder接收的 String类型
  6. 1. FormattedMessage 默认生成一个 span,不是纯文本字符串;默认返回 <span>标签
  7. 2. 解决:用 injectIntl 将 intl注入到组件
  8. <a name="o0hOg"></a>
  9. ### tabList
  10. ```jsx
  11. import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
  12. const tabList = [
  13. {
  14. key: 'title',
  15. tab: <FormattedMessage id="table.tab1" defaultMessage="名称" />,
  16. },
  17. {
  18. key: 'phone',
  19. tab: <FormattedMessage id="table.tab2" defaultMessage="电话" />,
  20. },
  21. ];

injectIntl处理字符串

  1. import {injectIntl, defineMessages} from 'react-intl';
  2. import {connect} from 'react-redux';
  3. import PageTitle from './PageTitle';
  4. const lang = defineMessages({
  5. label: {id: "common.home.title", defaultMessage: "首页"},
  6. });
  7. function mapStateToProps(state, props) {
  8. const { intl } = props
  9. return {
  10. label: intl.formatMessage(lang.label),
  11. }
  12. }
  13. export default injectIntl(connect(mapStateToProps)(MyComponent))
  1. import React from 'react';
  2. import { injectIntl, intlShape, FormattedRelative } from 'react-intl';
  3. Parent.propTypes = {
  4. intl: intlShape.isRequired
  5. }
  6. function Parent(props) {
  7. const { intl: {formatMessage} } = props
  8. const placeholder = formatMessage({id: 'messageId'});
  9. // 动态传值 第一个参数 id;第二个参数 value
  10. const name = formatMessage({id: 'intl.name'},{name: 'lucy'})
  11. return(
  12. <div>
  13. <input placeholder={placeholder} />
  14. <p title={intl.formatDate(date)}>
  15. <FormattedRelative value={date}/>
  16. </p>
  17. <FormattedMessage
  18. id="intl.name"
  19. values={{name: <b>{name}</b>}}
  20. />
  21. </div>
  22. );
  23. }
  24. export default injectIntl(Parent);

class组件

  1. injectIntl(Component);
  2. this.props.intl.formatMessage(...)
  3. @injectIntl
  4. class Parent extends Component {
  5. render() {
  6. const {intl} = this.props
  7. const defineMessage = defineMessages({
  8. batchPlaceholder: {
  9. id: 'list.placeholder',
  10. defaultMessage: '请选择用户'
  11. }
  12. })
  13. return (
  14. <div>{intl.formatMessage(defineMessage.batchPlaceholder)}</div>
  15. )
  16. }
  17. }

defineMessages 定义key值

优点:自动的多语言提取
缺点:

  • 组件多语言方便
  • 字符串多语言每次都要注入 intl;原因?formatMessage react-i18n不直接暴露 ```jsx import { injectIntl, defineMessages } from ‘react-intl’;

@injectIntl const defineMessage = defineMessages({ placeholder: { id: ‘member.info.placeholder’, defaultMessage: ‘请选择’ } })

intl.formatMessage(defineMessage.placeholder)

  1. <a name="QJkvX"></a>
  2. ## 动态传值
  3. locales/
  4. ```jsx
  5. // en-US.json
  6. const en_US = {
  7. hello: "Hello, {name}!"
  8. }
  9. // zh-CN.json
  10. const zh_CN = {
  11. hello: "{name},你好!"
  12. }

defineMessage.json定义常量

  1. 定义常量 utils/defineMessage.js
  2. 在组件引入常量使用

defineMessage.js

  1. import { defineMessages } from 'react-intl';
  2. const RuleMessage = defineMessages({
  3. rule: {
  4. id: 'common.rule',
  5. defaultMessage: '第{number}条规则',
  6. },
  7. title: {
  8. id: 'login.title',
  9. defaultMessage: '管理员登录'
  10. },
  11. placeholder: {
  12. id: 'common.placeholder',
  13. defaultMessage: '请输入 {value}',
  14. },
  15. help: {
  16. id: 'common.help',
  17. defaultMessage: '需要帮助'
  18. }
  19. }

Component组件使用

  1. import { injectIntl } from 'react-intl';
  2. import { defineMessage as lang } from '$utils/defineMessage';
  3. // hooks
  4. function App({intl}) {
  5. const { formatMessage } = intl;
  6. const {
  7. name: formatMessage(lang.rule, { number }),
  8. user: 'lucy',
  9. }
  10. }
  11. // class组件
  12. @injectIntl
  13. class Login extends React.PureComponent {
  14. render () {
  15. const { intl: formatMessage } = this.props;
  16. return (
  17. <Card title={forMatMessage(lang.title)} />
  18. )
  19. }
  20. }
  21. export default Login

FormattedMessage 传值

  1. import { FormattedMessage } from 'react-intl';
  2. <FormattedMessage
  3. id="intl.name"
  4. tagName="div"
  5. description="用户名"
  6. defaultMessage="Hello, {name}!"
  7. values={{name: <b>{name}</b>}}
  8. />

https://blog.csdn.net/function__/article/details/72778964