如果我错了请纠正我,ReactIntl中的FormattedMessage返回一个由span标签包装的字符串。在ReactIntl 1.2中,我们可以选择使用this.getIntlMessage('key')
来获取字符串部分。
这是我的问题:在ReactIntl 2.0中是否有相同的功能?我知道可以通过将FormattedMessage中的Function-As-Child模式用作
来获取字符串<FormattedMessage id="placeholder">
{(formattedValue)=>(
<MyComponent ref="mycomponent" placeholder={formattedValue}/>
)}
</FormattedMessage>
然而,它弄乱了我的组件中的'ref',我无法再使用this.refs.mycomponent
访问该组件。
答案 0 :(得分:8)
您可以使用react-intl。
提供的intl对象轻松返回字符串这是你在反应类中使用intl对象的更简单的方法。
注意:渲染组件(主要组件)应该使用IntlProvider
进行换行
class MySubComponent extends React.Component{
{/*....*/}
render(){
return(
<div>
<input type="text" placeholder = {this.context.intl.formatMessage({id:"your_id", defaultMessage: "your default message"})}
</div>
)
}
}
MySubComponent.contextTypes ={
intl:React.PropTypes.object.isRequired
}
通过定义contextTypes,它将使您能够使用作为上下文类型prop的intl对象。有关更多详细信息,请参阅反应上下文。
答案 1 :(得分:8)
最好解决placeholder
问题。
<FormattedMessage ...messages.placeholderIntlText>
{
(msg) => <input type="text" placeholder = {msg} />
}
</FormattedMessage>
答案 2 :(得分:5)
好的,有一个解决方法。我可以在组件中添加 ReactIntl 作为上下文:
contextTypes: {
intl: React.PropTypes.object.isRequired,
},
然后,当尝试检索消息的字符串并使用它时,例如在占位符中,我可以这样做。
<MyComponent ref="mycomponent" placeholder={this.context.intl.messages.placeholder}/>
答案 3 :(得分:1)
如果您使用的是功能组件,那么您可以使用 useIntl()
钩子来获取 intl
对象,并从下面的代码片段中以 string
的形式获取消息。
import {IntlProvider, useIntl} from 'react-intl';
export function MyFunctionalComponent() {
const intl = useIntl();
return (
<div>
<p>{intl.formatMessage({id: "MyKey"})}</p>
</div>
)
}
注意:您的父组件应该包裹在 </IntlProvider>
提供程序中。
答案 4 :(得分:0)
我使用React渲染道具解决了这个问题。
我创建了一个实现它的npm软件包:http://g14n.info/react-intl-inject/
它是这样的组件
import { injectIntl } from 'react-intl'
export default function reactIntlInject ({ children, ...props }) {
if (typeof children === 'function') {
return (
children(props)
)
} else {
return null
}
}
您可以使用它来包装例如具有您要翻译的道具的组件,例如
import React, { Component } from 'react'
// Import the package I created, available on npm with MIT license....
import InjectIntl from 'react-intl-inject'
// ...or copy the code above in a file in your project and import it, somethong like
// import InjectIntl from './path/to/my/render/prop/component'
class MyComponent extends Component {
render () {
return (
<InjectIntl>
{({ intl }) => (
<button
type='submit'
value={intl.formatMessage({ id: 'enter.submit' })}
/>
)}
</InjectIntl>
)
}
}
export default injectIntl(reactIntlInject)