gpt4 book ai didi

javascript - 如何从消费者更新提供者中的上下文值?

转载 作者:可可西里 更新时间:2023-11-01 01:25:16 25 4
gpt4 key购买 nike

MyContext.js

import React from "react";

const MyContext = React.createContext('test');
export default MyContext;

我在一个单独的 js 文件中创建了我的上下文,我可以在其中访问我的父组件和我的子组件

Parent.js

import MyContext from "./MyContext.js";
import Child from "./Child.js";

class Parent extends Component {

constructor(props) {
super(props);
this.state = {
Message: "Welcome React",
ReturnMessage:""
};
}

render() {
return (
<MyContext.Provider value={{state: this.state}}>
<Child />
</MyContext.Provider>
)
}
}

所以我创建了带有 Provider 上下文的父组件,并在 provider 选项卡中调用子组件

Child.js

import MyContext from "./MyContext.js";

class Child extends Component {

constructor(props) {
super(props);
this.state = {
ReturnMessage:""
};
}

ClearData(context){
this.setState({
ReturnMessage:e.target.value
});
context.state.ReturnMessage = ReturnMessage
}

render() {
return (
<MyContext.Consumer>
{(context) => <p>{context.state.Message}</p>}
<input onChange={this.ClearData(context)} />
</MyContext.Consumer>
)
}
}

因此在子级中,通过使用 Consumer,我可以在子级渲染部分显示数据。

当我想更新来自消费者的状态时,我遇到了一个问题。

如何更新提供者状态或操作提供者状态?

最佳答案

您可以使用 useContext Hook 来实现此目的。在 Provider 的子元素中使用它非常容易。举个例子……

authContext.js

import { createContext } from "react";

const authContext = createContext({
authenticated: false,
setAuthenticated: (auth) => {}
});

export default authContext;

Login.js(使用上下文的组件)

import React, { useContext } from "react";
import authContext from "./authContext";

export default () => {
const { setAuthenticated } = useContext(authContext);
const handleLogin = () => setAuthenticated(true);
const handleLogout = () => setAuthenticated(false);

return (
<React.Fragment>
<button onClick={handleLogin}>login</button>
<button onClick={handleLogout}>logout</button>
</React.Fragment>
);
};

最后是 index.js

import ReactDOM from "react-dom";
import React, { useState } from "react";

import authContext from "./authContext";
import Login from "./Login";

const App = () => {
const [authenticated, setAuthenticated] = useState(false);

return (
<authContext.Provider value={{ authenticated, setAuthenticated }}>
<div> user is {`${authenticated ? "" : "not"} authenticated`} </div>
<Login />
</authContext.Provider>
);
};

ReactDOM.render(<App />, document.getElementById("container"));

如您所见,使用 useContext Hook 使用存储在上下文中的数据变得非常容易。当然,与每个 React 钩子(Hook)一样,它只适用于功能组件。

如果您想查看代码的运行情况。 https://codesandbox.io/s/react-playground-forked-wbqsh?file=/index.js

关于javascript - 如何从消费者更新提供者中的上下文值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502664/

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