想要在语言发生变化后重新执行高阶组件以重新呈现错误消息

时间:2017-09-01 19:40:13

标签: reactjs internationalization

我根据https://facebook.github.io/react/docs/higher-order-components.html编写了一个高阶组件(HOC)。它包装了一个呈现某种类型的纯组件。

我的HOC获取验证函数作为属性。当输入值改变时,它调用验证器(newValue)。 validator()返回错误消息或空字符串。 validator()方法可以依次调用一种方法,根据用户设置将其错误消息转换为不同的语言。

我的问题是,如果用户在显示错误消息后更改了语言,则React不会以新选择的语言重新呈现错误消息,因为只有在validator()返回不同的值时才会呈现,只有在包装输入的值发生变化时,才会调用validator()。除非我将该语言作为HOC的财产,否则HOC无法知道该语言已发生变化。

我最初编写HOC接受所选语言作为属性,然后翻译其validator()属性返回的任何错误消息,但我认为由于关注混合,这有“气味”。我认为HOC不应该了解当前的语言,因为这不是它的关注点。使用所选语言生成错误消息应该是每个validator()方法的责任。这有意义吗?

我想到的一个hack是让changeLanguage()处理程序技巧React认为所有输入都通过迭代子DOM中的所有输入而进行了更改,取消设置,然后将它们重置为当前值。这将强制所有validator()方法再次运行,这次以新选择的语言生成错误消息。当然,这是一个黑客攻击。我会用另一种反模式切换一种反模式。

我知道改变语言是一种优势。我打算根据Accept-Language HTTP标头设置语言,但我读到这是不鼓励的,因为不能总是依赖Accept-Language来反映用户实际想要的内容。您可以将其作为第一个猜测使用,但如果有多个选择,则必须给他一种更改方法。所以这打开了潘多拉盒子。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我可以回答我自己的问题。

HOC呈现错误消息。我可以将该部分分解为它自己的React组件,并为其提供语言属性,以便在语言发生变化时重新呈现。简单!