gpt4 book ai didi

javascript - 根据另一个组件更新的全局变量更新 React 组件

转载 作者:行者123 更新时间:2023-11-30 20:01:09 26 4
gpt4 key购买 nike

我有一个名为 global.language 的全局变量。在我的 CustomHeader 组件中,我有一个 Button 可以切换语言全局变量。我想要的是更新我所有的屏幕组件以反射(reflect)语言变化。

我不知道最好的方法是获取对屏幕的引用还是使用事件库,或者是否有 React 友好的方法可以做到这一点。

我的 CustomHeader.js 看起来像这样:

export default class CustomHeader extends React.Component {
constructor(props) {
super(props);

this.toggleLanguage = this.toggleLanguage.bind(this);
}

render() {
return (
<Button onPress={ this.toggleLanguage } title="Language" accessibilityLabel="Toggle language" />
);
}

toggleLanguage() {
if (global.language == "PT") global.language = "EN";
else if (global.language == "EN") global.language = "PT";
}
}

我的 Screen.js 渲染了许多名为 Event 的组件。这就是我的 Event.js 的样子:

export default class Event extends React.Component {
constructor(props) {
super(props);
}

render() {
return (
<Card>
<Text>{Event.getTitle(this.props.data)}</Text>
</Card>
);
}

static getTitle(data) {
if (global.language === "PT") return data.title;
else if (global.language === "EN") return data.title_english;
}
}

最佳答案

Live sandbox

详细信息。 React.createContext我们可以导出以供重用。但这只是“通用”上下文。更好地将我们需要的数据和方法封装到自定义容器元素和 HOC 中:

import React from "react";

const context = React.createContext();
export class I18N extends React.Component {
state = {
language: "en"
};

setLanguage = language => {
this.setState({ language });
};

render() {
return (
<context.Provider
value={{ language: this.state.language, setLanguage: this.setLanguage }}
>
{this.props.children}
</context.Provider>
);
}
}

export function withI18n(Component) {
return props => (
<context.Consumer>
{i18nContext => <Component {...props} i18n={i18nContext} />}
</context.Consumer>
);
}

<I18N>是通常只会在最顶层出现一次的提供者。和 HOC withI18n我们将包装每个需要访问我们的语言值或更新此值的能力的元素。

import React from "react";
import ReactDOM from "react-dom";
import { I18N, withI18n } from "./i18n";

const Header = withI18n(function({i18n}) {
const setLang = ({ target: { value } }) => i18n.setLanguage(value);
return (
<div>
<input type="radio" value="en" checked={i18n.language === "en"} onChange={setLang} /> English
<input type="radio" value="fr" checked={i18n.language === "fr"} onChange={setLang} /> French
<input type="radio" value="es" checked={i18n.language === "es"} onChange={setLang} /> Spanish
</div>
);
});

const Body = withI18n(function(props) {
return <div>Current language is {props.i18n.language}</div>;
});

const rootElement = document.getElementById("root");
ReactDOM.render(<I18N>
<Header />
<Body />
</I18N>, rootElement);

最后是一篇带有一些额外细节的好文章:https://itnext.io/combining-hocs-with-the-new-reacts-context-api-9d3617dccf0b

关于javascript - 根据另一个组件更新的全局变量更新 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53362783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com