gpt4 book ai didi

reactjs - Class.contextType 和 Context.Consumer 之间的区别与工作示例

转载 作者:行者123 更新时间:2023-12-04 02:34:29 25 4
gpt4 key购买 nike

我正在尝试了解 React 上下文 API,并且正在阅读官方文档。如果有人能对以下几点提出更多说明,我将不胜感激,因为官方文档没有明确说明。

  1. contextType 和 Consumer 方法有什么区别使用 Provider 提供的值?在什么情况下我们应该使用哪种方法?
  2. Provider在基于类的组件中暴露的值可以是由使用 useContext 的 react 钩子(Hook)组件使用?我有同样的设置,我最终将 useContext 转换为 Context.Consumer。
  3. 我有一个非常简单的设置,其中我有一个提供者类基于暴露一些状态值的组件。提供者只有一个子组件,它也是一个消费者。当我使用Context.Consumer 在 child 中获取值,一切按预期工作。但是当我在 children 中使用 contextType组件,我看到一个空对象。

ContextProvider.js

import React from "react";
import {ContextConsumer} from "./ContextConsumer";
export const TestContext = React.createContext({
count: 1,
incrCount: (count)=>{
console.log(`count value :- ${count}`)
}
});

export class ContextProvider extends React.Component {
incrCount = () => {
this.setState({
count: this.state.count + 1,
});
};

state = {
count: 5,
incrCount: this.incrCount,
};

render() {
return (
<TestContext.Provider value={this.state}>
<ContextConsumer />
</TestContext.Provider>
);
}
}

ContextConsumer.js

import React from "react";
import { TestContext } from "./ContextProvider";

export class ContextConsumer extends React.Component {
static contextType=TestContext

componentDidMount() {
const {count,incrCount}= this.context;
console.log(`count:- ${(count)}`)
console.log(`incrCount:- ${incrCount}`)
}
render() {


return (
<div>


**// BELOW CODE IS WORKING AS EXPECTED**
<TestContext.Consumer>
{({ count, incrCount }) => (
<button onClick={incrCount}>Count is {count}</button>
)}
</TestContext.Consumer>
</div>
);
}
}

App.js

import {ContextProvider}  from "../../playground/ContextProvider";

const output = (
<Provider store={reduxStore}>
<ContextProvider />
</Provider>
);

ReactDOM.render(output, document.getElementById("root"));

最佳答案

contextType和Consumer方法消费Provider提供的值有什么区别?在什么情况下我们应该使用哪种方法?

static contextType 赋值是在 v16.6.0 中引入的,作为在渲染方法之外使用上下文的一种方式。 Consumer 和静态上下文之间的唯一区别是,使用 contextType 还允许您在渲染方法之外使用上下文

Provider在基于类的组件中暴露的值可以被使用useContext的react hook组件使用吗?

是的,来自 Provider 的上下文值也可以被 useContext 使用。但是,您只能在功能组件中使用 useContext 而不能在类组件中使用,并且在 v16.8.0 或支持钩子(Hook)的 react 之后也可以使用

P.S.您必须确保通过在消费者组件中导入提供程序不会导致循环依赖,反之亦然

Edit FORM VALUES

关于reactjs - Class.contextType 和 Context.Consumer 之间的区别与工作示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62464615/

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