Reaction将“This”传递给上下文提供程序值

c9qzyr3d  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(180)

我在使用类组件中的useContext。我已经创建了一个简单的Reaction(Nextjs)应用程序,只需一个按钮,就可以在上下文中调用更新状态的函数,从而重新呈现主组件。

  1. import { useContext } from "react";
  2. import { UserContext } from "../provider/TestProvider";
  3. export default function Home() {
  4. let [contex] = useContext(UserContext);
  5. // Without the destructuring assignment
  6. // let contex = useContext(UserContext);
  7. return (
  8. <>
  9. <button onClick={() => contex.addOne()}>Add 1</button>
  10. {contex.state.count.map((e) => (
  11. <div key={Math.random()}> {e} </div>
  12. ))}
  13. </>
  14. );
  15. }
  1. import { createContext, Component } from "react";
  2. export const UserContext = createContext();
  3. export default class TestProvider extends Component {
  4. state = {count: []};
  5. constructor(props) {
  6. super(props);
  7. this.props = props;
  8. }
  9. addOne() {
  10. let oldState = [...this.state.count];
  11. oldState.push("test");
  12. this.setState({ count: oldState });
  13. }
  14. render() {
  15. return ( // Changing value to value={this}
  16. <UserContext.Provider value={[this]}>
  17. {this.props.children}
  18. </UserContext.Provider>
  19. );
  20. }
  21. }

注意:它 Package 到_app.js内的整个应用程序的提供程序

这可以很好地工作,但是我想知道为什么我被迫在数组中传递this

  1. value={[this]}

当我尝试只传递这个(value={this})并修改上下文时

  1. let contex = useContext(UserContext)

Home函数不再对状态的更改做出React,因此不会重现。

根据我的编程知识,这两个选项的行为应该完全相同。

这是怎么回事?

ilmyapht

ilmyapht1#

问题

您只是“被迫”将上下文值作为value={[this]}传递,因为这是您在使用者中访问它的方式。

  1. let [contex] = useContext(UserContext);

这里使用数组析构赋值数组中获取可访问的上下文值

  1. contex.state.count

换句话说,this.state.countcontex.state.count是一回事。

更重要的是,您被迫从数组中使用它,因为它就是这样提供的:value={[this]}

解决方案

与其传递根父类组件的整个this对象,不如只传递您需要的*,比如只传递count状态和addOne回调函数。

示例:

  1. export const UserContext = createContext({
  2. addOne: () => {},
  3. count: [],
  4. });
  5. export default class TestProvider extends Component {
  6. state = { count: [] };
  7. addOne = () => {
  8. this.setState(prevState => ({
  9. count: [...prevState.count, "test"];
  10. }));
  11. }
  12. render() {
  13. const { children } = this.props;
  14. const { count } = this.state;
  15. return (
  16. <UserContext.Provider value={{ addOne, count }}> // provided as object
  17. {children}
  18. </UserContext.Provider>
  19. );
  20. }
  21. }

..。

  1. import { useContext } from "react";
  2. import { UserContext } from "../provider/TestProvider";
  3. export default function Home() {
  4. const { addOne, count } = useContext(UserContext); // object destructuring assignment
  5. return (
  6. <>
  7. <button onClick={addOne}>Add 1</button>
  8. {count.map((e) => (
  9. <div key={e}>{e}</div>
  10. ))}
  11. </>
  12. );
  13. }

不过,这里的主要要点应该是,无论您如何消费,上下文值应该与您提供它的方式相匹配。

展开查看全部

相关问题