React的contextType的使用方法简介
<p><span style="font-size: 18px">上一篇介绍了Context的使用方法。但是Context会让组件变得不纯粹,因为依赖了全局变量。所以这决定了Context一般不会大规模的使用。所以一般在一个组件中使用一个Context就好。</span></p><div><span style="font-size: 18px">由于Consumer的特性,里面的代码必须是这个函数的返回值。这样就显得复杂与不优雅了。那该怎么解决呢?这样<strong>contextType</strong>就派上用场了。</span></div>
<div> </div>
<p><span style="font-size: 18px">还拿上一篇的demo来举例。并且修改它。 上一篇的代码:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px">import React, { Component, createContext } from 'react'<span style="color: rgba(0, 0, 0, 1)">;
const BatteryContext </span>=<span style="color: rgba(0, 0, 0, 1)"> createContext();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">声明一个孙组件</span>
<span style="color: rgba(0, 0, 0, 1)">class Leaf extends Component {
render() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><BatteryContext.Consumer><span style="color: rgba(0, 0, 0, 1)">
{
battery </span>=> <h1>Battery : {battery}</h1>
<span style="color: rgba(0, 0, 0, 1)"> }
</span></BatteryContext.Consumer>
<span style="color: rgba(0, 0, 0, 1)"> )
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">声明一个子组件</span>
<span style="color: rgba(0, 0, 0, 1)">class Middle extends Component {
render() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <Leaf />
<span style="color: rgba(0, 0, 0, 1)">}
}
class App extends Component {
render(){
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><BatteryContext.Provider value={60}>
<Middle />
</BatteryContext.Provider>
<span style="color: rgba(0, 0, 0, 1)"> );
}
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> App;</span></pre>
</div>
<p> </p>
<p><span style="font-size: 18px"> 接下里我们修改他,使他更加优雅一些:</span></p>
<p><span style="font-size: 18px">我们只需要修<Leaf/>组件的代码就可以。</span></p>
<p> </p>
<p><span style="font-size: 18px">首先我们用static来声明contextType:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px">static contextType = BatteryContext;</span></pre>
</div>
<p> </p>
<p> </p>
<div><span style="font-size: 18px">这样在运行时就可以获取到一个新的属性。我们来接收他。</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 16px">const battery = <span style="color: rgba(0, 0, 255, 1)">this</span>.context;</span></pre>
</div>
<p> </p>
<div><span style="font-size: 18px">这样Consumer就可以完全不再使用了。</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"> <span style="color: rgba(0, 0, 255, 1)">return</span><h1>Battery : {battery}</h1><br></span></pre>
</div>
<p> </p>
</div>
</div>
<p><span style="font-size: 18px"> 全部代码:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px">import React, { Component, createContext } from 'react'<span style="color: rgba(0, 0, 0, 1)">;
const BatteryContext </span>=<span style="color: rgba(0, 0, 0, 1)"> createContext();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">声明一个孙组件</span>
<span style="color: rgba(0, 0, 0, 1)">class Leaf extends Component {
static contextType </span>=<span style="color: rgba(0, 0, 0, 1)"> BatteryContext;
render() {
const battery </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.context;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><h1>Battery : {battery}</h1><span style="color: rgba(0, 0, 0, 1)">
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">声明一个子组件</span>
<span style="color: rgba(0, 0, 0, 1)">class Middle extends Component {
render() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <Leaf />
<span style="color: rgba(0, 0, 0, 1)">}
}
class App extends Component {
state </span>=<span style="color: rgba(0, 0, 0, 1)"> {
battery: </span>60<span style="color: rgba(0, 0, 0, 1)">,
}
render() {
const { battery } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><BatteryContext.Provider value={battery}>
<<span style="color: rgba(0, 0, 0, 1)">button
type</span>="button"<span style="color: rgba(0, 0, 0, 1)">
onClick</span>={() => <span style="color: rgba(0, 0, 255, 1)">this</span>.setState({ battery: battery - 1<span style="color: rgba(0, 0, 0, 1)"> })}
</span>><span style="color: rgba(0, 0, 0, 1)">
减减
</span></button>
<Middle />
</BatteryContext.Provider>
<span style="color: rgba(0, 0, 0, 1)"> );
}
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> App;</span></pre>
</div>
<p> </p>
<p> </p>
<p><span style="font-size: 18px">效果图:</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1557620/201907/1557620-20190721170825033-735541269.jpg" alt=""></p>
<p> </p>
<div><span style="font-size: 18px">效果和使用Consumer没有什么区别。可见只有一个Context的时候,使用contextType要比使用Consumer简单的多。</span></div>
<p> </p><br><br>
来源:https://www.cnblogs.com/littleSpill/p/11221817.html
頁:
[1]