{"id":1419,"date":"2024-06-02T23:05:00","date_gmt":"2024-06-02T23:05:00","guid":{"rendered":""},"modified":"2024-06-05T06:12:46","modified_gmt":"2024-06-04T22:12:46","slug":"react-%e4%b9%8b-context-%e7%9a%84%e5%8f%98%e8%bf%81%e4%b8%8e%e8%83%8c%e5%90%8e%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1419","title":{"rendered":"React \u4e4b Context \u7684\u53d8\u8fc1\u4e0e\u80cc\u540e\u5b9e\u73b0"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">Context<\/h2>\n<p dir=\"auto\">\u672c\u7bc7\u6211\u4eec\u8bb2 Context\uff0cContext \u53ef\u4ee5\u5b9e\u73b0\u8de8\u7ec4\u4ef6\u4f20\u9012\u6570\u636e\uff0c\u5927\u90e8\u5206\u7684\u65f6\u5019\u5e76\u65e0\u9700\u8981\uff0c\u4f46\u6709\u7684\u65f6\u5019\uff0c\u6bd4\u5982\u7528\u6237\u8bbe\u7f6e \u4e86 UI \u4e3b\u9898\u3001\u5730\u533a\u504f\u597d\uff0c\u5982\u679c\u4ece\u9876\u5c42\u4e00\u5c42\u5c42\u5f80\u4e0b\u4f20\u53cd\u800c\u6709\u4e9b\u9ebb\u70e6\uff0c\u4e0d\u5982\u76f4\u63a5\u501f\u52a9 Context \u5b9e\u73b0\u6570\u636e\u4f20\u9012\u3002<\/p>\n<h2 dir=\"auto\">\u8001\u7684 Context API<\/h2>\n<h3 dir=\"auto\">\u57fa\u7840\u793a\u4f8b<\/h3>\n<p dir=\"auto\">\u5728\u8bb2\u6700\u65b0\u7684 API \u524d\uff0c\u6211\u4eec\u5148\u56de\u987e\u4e0b\u8001\u7684 Context API\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class Child extends React.Component {\n  render() {\n    \/\/ 4. \u8fd9\u91cc\u4f7f\u7528 this.context.value \u83b7\u53d6\n    return &lt;p&gt;{this.context.value}&lt;\/p&gt;\n  }\n}\n\n\/\/ 3. \u5b50\u7ec4\u4ef6\u6dfb\u52a0 contextTypes \u9759\u6001\u5c5e\u6027\nChild.contextTypes = {\n  value: PropTypes.string\n};\n\nclass Parent extends React.Component {\n\n  state = {\n    value: 'foo'\n  }\n\n  \/\/ 1. \u5f53 state \u6216\u8005 props \u6539\u53d8\u7684\u65f6\u5019\uff0cgetChildContext \u51fd\u6570\u5c31\u4f1a\u88ab\u8c03\u7528\n  getChildContext() {\n    return {value: this.state.value}\n  }\n\n  render() {\n    return (\n      &lt;div&gt;\n        &lt;Child \/&gt;\n      &lt;\/div&gt;\n    )\n  }\n}\n\n\/\/ 2. \u7236\u7ec4\u4ef6\u6dfb\u52a0 childContextTypes \u9759\u6001\u5c5e\u6027\nParent.childContextTypes = {\n  value: PropTypes.string\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c\">\/\/ 4. \u8fd9\u91cc\u4f7f\u7528 this.context.value \u83b7\u53d6<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/ 3. \u5b50\u7ec4\u4ef6\u6dfb\u52a0 contextTypes \u9759\u6001\u5c5e\u6027<\/span>\n<span class=\"pl-v\">Child<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">string<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n\n  <span class=\"pl-c1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">value<\/span>: <span class=\"pl-s\">'foo'<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-c\">\/\/ 1. \u5f53 state \u6216\u8005 props \u6539\u53d8\u7684\u65f6\u5019\uff0cgetChildContext \u51fd\u6570\u5c31\u4f1a\u88ab\u8c03\u7528<\/span>\n  <span class=\"pl-en\">getChildContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">value<\/span>: <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">state<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">}<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/ 2. \u7236\u7ec4\u4ef6\u6dfb\u52a0 childContextTypes \u9759\u6001\u5c5e\u6027<\/span>\n<span class=\"pl-v\">Parent<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">childContextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">string<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">context \u4e2d\u65ad\u95ee\u9898<\/h3>\n<p dir=\"auto\">\u5bf9\u4e8e\u8fd9\u4e2a API\uff0cReact \u5b98\u65b9\u5e76\u4e0d\u5efa\u8bae\u4f7f\u7528\uff0c\u5bf9\u4e8e\u53ef\u80fd\u4f1a\u51fa\u73b0\u7684\u95ee\u9898\uff0cReact \u6587\u6863\u7ed9\u51fa\u7684\u4ecb\u7ecd\u4e3a\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">\u95ee\u9898\u662f\uff0c\u5982\u679c\u7ec4\u4ef6\u63d0\u4f9b\u7684\u4e00\u4e2a context \u53d1\u751f\u4e86\u53d8\u5316\uff0c\u800c\u4e2d\u95f4\u7236\u7ec4\u4ef6\u7684 shouldComponentUpdate \u8fd4\u56de false\uff0c\u90a3\u4e48\u4f7f\u7528\u5230\u8be5\u503c\u7684\u540e\u4ee3\u7ec4\u4ef6\u4e0d\u4f1a\u8fdb\u884c\u66f4\u65b0\u3002\u4f7f\u7528\u4e86 context \u7684\u7ec4\u4ef6\u5219\u5b8c\u5168\u5931\u63a7\uff0c\u6240\u4ee5\u57fa\u672c\u4e0a\u6ca1\u6709\u529e\u6cd5\u80fd\u591f\u53ef\u9760\u7684\u66f4\u65b0 context\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u5bf9\u4e8e\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u5199\u4e2a\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ 1. Child \u7ec4\u4ef6\u4f7f\u7528 PureComponent\nclass Child extends React.Component {\n  render() {\n    return &lt;GrandChild \/&gt;\n  }\n}\n\nclass GrandChild extends React.Component {\n  render() {\n    return &lt;p&gt;{this.context.theme}&lt;\/p&gt;\n  }\n}\n\nGrandChild.contextTypes = {\n  theme: PropTypes.string\n};\n\nclass Parent extends React.Component {\n\n  state = {\n    theme: 'red'\n  }\n\n  getChildContext() {\n    return {theme: this.state.theme}\n  }\n\n  render() {\n    return (\n      &lt;div onClick={() =&gt; {\n        this.setState({\n          theme: 'blue'\n        })\n      }}&gt;\n        &lt;Child \/&gt;\n        &lt;Child \/&gt;\n      &lt;\/div&gt;\n    )\n  }\n}\n\nParent.childContextTypes = {\n  theme: PropTypes.string\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 1. Child \u7ec4\u4ef6\u4f7f\u7528 PureComponent<\/span>\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">GrandChild<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">GrandChild<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-v\">GrandChild<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">string<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n\n  <span class=\"pl-c1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-s\">'red'<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-en\">getChildContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">theme<\/span>: <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">state<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">}<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span> <span class=\"pl-c1\">onClick<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">setState<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-s\">'blue'<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-v\">Parent<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">childContextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">string<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u8fd9\u4e2a\u793a\u4f8b\u4ee3\u7801\u4e2d\uff0c\u5f53\u70b9\u51fb\u6587\u5b57 <code class=\"notranslate\">red<\/code> \u7684\u65f6\u5019\uff0c\u6587\u5b57\u5e76\u4e0d\u4f1a\u4fee\u6539\u4e3a <code class=\"notranslate\">blue<\/code>\uff0c\u5982\u679c\u6211\u4eec\u628a Child \u6539\u4e3a <code class=\"notranslate\">extends Component<\/code>\uff0c\u5219\u80fd\u6b63\u5e38\u4fee\u6539<\/p>\n<p dir=\"auto\">\u8fd9\u8bf4\u660e\u5f53\u4e2d\u95f4\u7ec4\u4ef6\u7684 <code class=\"notranslate\">shouldComponentUpdate<\/code> \u4e3a <code class=\"notranslate\">false<\/code> \u65f6\uff0c\u4f1a\u4e2d\u65ad  Context \u7684\u4f20\u9012\u3002<\/p>\n<p dir=\"auto\">PureComponent \u7684\u5b58\u5728\u662f\u4e3a\u4e86\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684\u6e32\u67d3\uff0c\u4f46\u6211\u4eec\u53c8\u60f3 Context \u80fd\u6b63\u5e38\u4f20\u9012\uff0c\u54ea\u6709\u529e\u6cd5\u53ef\u4ee5\u89e3\u51b3\u5417\uff1f<\/p>\n<p dir=\"auto\">\u65e2\u7136 PureComponent \u7684\u5b58\u5728\u5bfc\u81f4\u4e86 Context \u65e0\u6cd5\u518d\u66f4\u65b0\uff0c\u90a3\u5c31\u5e72\u8106\u4e0d\u66f4\u65b0\u4e86\uff0cContext \u4e0d\u66f4\u65b0\uff0cGrandChild \u5c31\u65e0\u6cd5\u66f4\u65b0\u5417\uff1f<\/p>\n<h3 dir=\"auto\">\u89e3\u51b3\u65b9\u6848<\/h3>\n<p dir=\"auto\">\u65b9\u6cd5\u5f53\u7136\u662f\u6709\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ 1. \u5efa\u7acb\u4e00\u4e2a\u8ba2\u9605\u53d1\u5e03\u5668\uff0c\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u79f0\u547c\u5b83\u4e3a\u4f9d\u8d56\u6ce8\u5165\u7cfb\u7edf\uff08dependency injection system\uff09\uff0c\u7b80\u79f0 DI\nclass Theme {\n  constructor(value) {\n    this.value = value\n    this.subscriptions = []\n  }\n\n  setValue(value) {\n    this.value = value\n    this.subscriptions.forEach(f =&gt; f())\n  }\n\n  subscribe(f) {\n    this.subscriptions.push(f)\n  }\n}\n\n\nclass Child extends React.PureComponent {\n    render() {\n        return &lt;GrandChild \/&gt;\n    }\n}\n\n\nclass GrandChild extends React.Component {\n    componentDidMount() {\n      \/\/ 4. GrandChild \u83b7\u53d6 store \u540e\uff0c\u8fdb\u884c\u8ba2\u9605\n        this.context.theme.subscribe(() =&gt; this.forceUpdate())\n    }\n\n    \/\/ 5. GrandChild \u4ece store \u4e2d\u83b7\u53d6\u6240\u9700\u8981\u7684\u503c\n    render() {\n        return &lt;p&gt;{this.context.theme.value}&lt;\/p&gt;\n    }\n}\n\nGrandChild.contextTypes = {\n  theme: PropTypes.object\n};\n\nclass Parent extends React.Component {\n    constructor(p, c) {\n      super(p, c)\n      \/\/ 2. \u6211\u4eec\u5b9e\u4f8b\u5316\u4e00\u4e2a store\uff08\u60f3\u60f3 redux \u7684 store\uff09\uff0c\u5e76\u5b58\u5230\u5b9e\u4f8b\u5c5e\u6027\u4e2d\n      this.theme = new Theme('blue')\n    }\n\n    \/\/ 3. \u901a\u8fc7 context \u4f20\u9012\u7ed9 GrandChild \u7ec4\u4ef6\n    getChildContext() {\n        return {theme: this.theme}\n    }\n\n    render() {\n        \/\/ 6. \u901a\u8fc7 store \u8fdb\u884c\u53d1\u5e03\n        return (\n            &lt;div onClick={() =&gt; {\n                this.theme.setValue('red')\n            }}&gt;\n              &lt;Child \/&gt;\n              &lt;Child \/&gt;\n            &lt;\/div&gt;\n        )\n    }\n}\n\nParent.childContextTypes = {\n  theme: PropTypes.object\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 1. \u5efa\u7acb\u4e00\u4e2a\u8ba2\u9605\u53d1\u5e03\u5668\uff0c\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u79f0\u547c\u5b83\u4e3a\u4f9d\u8d56\u6ce8\u5165\u7cfb\u7edf\uff08dependency injection system\uff09\uff0c\u7b80\u79f0 DI<\/span>\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Theme<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">value<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">value<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-en\">setValue<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">value<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">value<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">forEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-en\">subscribe<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">PureComponent<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">GrandChild<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">GrandChild<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-c\">\/\/ 4. GrandChild \u83b7\u53d6 store \u540e\uff0c\u8fdb\u884c\u8ba2\u9605<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">subscribe<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">forceUpdate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-c\">\/\/ 5. GrandChild \u4ece store \u4e2d\u83b7\u53d6\u6240\u9700\u8981\u7684\u503c<\/span>\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">p<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-v\">GrandChild<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">object<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">p<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">c<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">p<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">c<\/span><span class=\"pl-kos\">)<\/span>\n      <span class=\"pl-c\">\/\/ 2. \u6211\u4eec\u5b9e\u4f8b\u5316\u4e00\u4e2a store\uff08\u60f3\u60f3 redux \u7684 store\uff09\uff0c\u5e76\u5b58\u5230\u5b9e\u4f8b\u5c5e\u6027\u4e2d<\/span>\n      <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Theme<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'blue'<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-c\">\/\/ 3. \u901a\u8fc7 context \u4f20\u9012\u7ed9 GrandChild \u7ec4\u4ef6<\/span>\n    <span class=\"pl-en\">getChildContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">theme<\/span>: <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c\">\/\/ 6. \u901a\u8fc7 store \u8fdb\u884c\u53d1\u5e03<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">div<\/span> <span class=\"pl-c1\">onClick<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">setValue<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'red'<\/span><span class=\"pl-kos\">)<\/span>\n            <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n              <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n            <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">div<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-v\">Parent<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">childContextTypes<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-v\">PropTypes<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">object<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e3a\u4e86\u7ba1\u7406\u6211\u4eec\u7684 theme \uff0c\u6211\u4eec\u5efa\u7acb\u4e86\u4e00\u4e2a\u4f9d\u8d56\u6ce8\u5165\u7cfb\u7edf\uff08DI\uff09\uff0c\u5e76\u901a\u8fc7 Context \u5411\u4e0b\u4f20\u9012 store\uff0c\u9700\u8981\u7528\u5230 store \u6570\u636e\u7684\u7ec4\u4ef6\u8fdb\u884c\u8ba2\u9605\uff0c\u4f20\u5165\u4e00\u4e2a forceUpdate \u51fd\u6570\uff0c\u5f53 store \u8fdb\u884c\u53d1\u5e03\u7684\u65f6\u5019\uff0c\u4f9d\u8d56 theme \u7684\u5404\u4e2a\u7ec4\u4ef6\u6267\u884c forceUpdate\uff0c\u7531\u6b64\u5b9e\u73b0\u4e86\u5728 Context \u4e0d\u66f4\u65b0\u7684\u60c5\u51b5\u4e0b\u5b9e\u73b0\u4e86\u5404\u4e2a\u4f9d\u8d56\u7ec4\u4ef6\u7684\u66f4\u65b0\u3002<\/p>\n<p dir=\"auto\">\u4f60\u53ef\u80fd\u4e5f\u53d1\u73b0\u4e86\uff0c\u8fd9\u6709\u4e86\u4e00\u70b9 react-redux \u7684\u5473\u9053\u3002<\/p>\n<p dir=\"auto\">\u5f53\u7136\u6211\u4eec\u4e5f\u53ef\u4ee5\u501f\u52a9 Mobx \u6765\u5b9e\u73b0\u5e76\u7b80\u5316\u4ee3\u7801\uff0c\u5177\u4f53\u7684\u5b9e\u73b0\u53ef\u4ee5\u53c2\u8003 Michel Weststrate\uff08Mobx \u7684\u4f5c\u8005\uff09 \u7684 <a href=\"https:\/\/medium.com\/@mweststrate\/how-to-safely-use-react-context-b7e343eff076\" rel=\"nofollow\">How to safely use React context<\/a><\/p>\n<h2 dir=\"auto\">\u65b0\u7684 Context API<\/h2>\n<h3 dir=\"auto\">\u57fa\u7840\u793a\u4f8b<\/h3>\n<p dir=\"auto\">\u60f3\u5fc5\u5927\u5bb6\u90fd\u6216\u591a\u6216\u5c11\u7684\u7528\u8fc7\uff0c\u6211\u4eec\u76f4\u63a5\u4e0a\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ 1. \u521b\u5efa Provider \u548c Consumer\nconst {Provider, Consumer} = React.createContext('dark');\n\nclass Child extends React.Component {\n  \/\/ 3. Consumer \u7ec4\u4ef6\u63a5\u6536\u4e00\u4e2a\u51fd\u6570\u4f5c\u4e3a\u5b50\u5143\u7d20\u3002\u8fd9\u4e2a\u51fd\u6570\u63a5\u6536\u5f53\u524d\u7684 context \u503c\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a React \u8282\u70b9\u3002\n  render() {\n    return (\n      &lt;Consumer&gt;\n        {(theme) =&gt; (\n        &lt;button&gt;\n          {theme}\n        &lt;\/button&gt;\n      )}\n      &lt;\/Consumer&gt;\n    )\n  }\n}\n\nclass Parent extends React.Component {\n\n  state = {\n    theme: 'dark',\n  };\n\n  componentDidMount() {\n    setTimeout(() =&gt; {\n      this.setState({\n        theme: 'light'\n      })\n    }, 2000)\n  }\n\n\n  render() {\n    \/\/ 2. \u901a\u8fc7 Provider \u7684 value \u4f20\u9012\u503c\n    return (\n      &lt;Provider value={this.state.theme}&gt;\n        &lt;Child \/&gt;\n      &lt;\/Provider&gt;\n    )\n  }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 1. \u521b\u5efa Provider \u548c Consumer<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">{<\/span>Provider<span class=\"pl-kos\">,<\/span> Consumer<span class=\"pl-kos\">}<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">createContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'dark'<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Child<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ 3. Consumer \u7ec4\u4ef6\u63a5\u6536\u4e00\u4e2a\u51fd\u6570\u4f5c\u4e3a\u5b50\u5143\u7d20\u3002\u8fd9\u4e2a\u51fd\u6570\u63a5\u6536\u5f53\u524d\u7684 context \u503c\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a React \u8282\u70b9\u3002<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Consumer<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">theme<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">(<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">button<\/span><span class=\"pl-c1\">&gt;<\/span>\n          <span class=\"pl-kos\">{<\/span><span class=\"pl-s1\">theme<\/span><span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">button<\/span><span class=\"pl-c1\">&gt;<\/span>\n      <span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">}<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">Consumer<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Parent<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Component<\/span> <span class=\"pl-kos\">{<\/span>\n\n  <span class=\"pl-c1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-s\">'dark'<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">setTimeout<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">setState<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c1\">theme<\/span>: <span class=\"pl-s\">'light'<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2000<\/span><span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c\">\/\/ 2. \u901a\u8fc7 Provider \u7684 value \u4f20\u9012\u503c<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">(<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Provider<\/span> <span class=\"pl-c1\">value<\/span><span class=\"pl-c1\">=<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">state<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">theme<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&gt;<\/span>\n        <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-ent\">Child<\/span> <span class=\"pl-c1\">\/<\/span><span class=\"pl-c1\">&gt;<\/span>\n      <span class=\"pl-c1\">&lt;<\/span><span class=\"pl-c1\">\/<\/span><span class=\"pl-ent\">Provider<\/span><span class=\"pl-c1\">&gt;<\/span>\n    <span class=\"pl-kos\">)<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5f53 Provider \u7684 value \u503c\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u5185\u90e8\u7684\u6240\u6709 consumer \u7ec4\u4ef6\u90fd\u4f1a\u91cd\u65b0\u6e32\u67d3\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u65b0 API \u7684\u597d\u5904\u5c31\u5728\u4e8e\u4ece Provider \u5230\u5176\u5185\u90e8 consumer \u7ec4\u4ef6\uff08\u5305\u62ec .contextType \u548c useContext\uff09\u7684\u4f20\u64ad\u4e0d\u53d7\u5236\u4e8e shouldComponentUpdate \u51fd\u6570\uff0c\u56e0\u6b64\u5f53 consumer \u7ec4\u4ef6\u5728\u5176\u7956\u5148\u7ec4\u4ef6\u8df3\u8fc7\u66f4\u65b0\u7684\u60c5\u51b5\u4e0b\u4e5f\u80fd\u66f4\u65b0\u3002<\/p>\n<\/blockquote>\n<h3 dir=\"auto\">\u6a21\u62df\u5b9e\u73b0<\/h3>\n<p dir=\"auto\">\u90a3\u4e48 createContext \u662f\u600e\u4e48\u5b9e\u73b0\u7684\u5462\uff1f\u6211\u4eec\u5148\u4e0d\u770b\u6e90\u7801\uff0c\u6839\u636e\u524d\u9762\u7684\u8ba2\u9605\u53d1\u5e03\u5668\u7684\u7ecf\u9a8c\uff0c\u6211\u4eec\u81ea\u5df1\u5176\u5b9e\u5c31\u53ef\u4ee5\u5199\u51fa\u4e00\u4e2a createContext \u6765\uff0c\u6211\u4eec\u5199\u4e00\u4e2a\u8bd5\u8bd5\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class Store {\n    constructor() {\n        this.subscriptions = []\n    }\n\n    publish(value) {\n        this.subscriptions.forEach(f =&gt; f(value))\n    }\n\n    subscribe(f) {\n        this.subscriptions.push(f)\n    }\n}\n\nfunction createContext(defaultValue) {\n    const store = new Store();\n\n    \/\/ Provider\n    class Provider extends React.PureComponent {\n        componentDidUpdate() {\n            store.publish(this.props.value);\n        }\n\n        componentDidMount() {\n            store.publish(this.props.value);\n        }\n\n        render() {\n            return this.props.children;\n        }\n    }\n\n    \/\/ Consumer\n    class Consumer extends React.PureComponent {\n        constructor(props) {\n            super(props);\n            this.state = {\n                value: defaultValue\n            };\n\n            store.subscribe(value =&gt; {\n                this.setState({\n                        value\n                });\n            });\n        }\n\n        render() {\n            return this.props.children(this.state.value);\n        }\n    }\n\n    return {\n            Provider,\n            Consumer\n    };\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Store<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-en\">publish<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">value<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">forEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">value<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-en\">subscribe<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">subscriptions<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">defaultValue<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">store<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Store<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-c\">\/\/ Provider<\/span>\n    <span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Provider<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">PureComponent<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">componentDidUpdate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-s1\">store<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">publish<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">props<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-en\">componentDidMount<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-s1\">store<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">publish<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">props<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">props<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">children<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-c\">\/\/ Consumer<\/span>\n    <span class=\"pl-k\">class<\/span> <span class=\"pl-v\">Consumer<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-v\">React<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">PureComponent<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-en\">constructor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-smi\">super<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">props<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-c1\">value<\/span>: <span class=\"pl-s1\">defaultValue<\/span>\n            <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n            <span class=\"pl-s1\">store<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">subscribe<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">value<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">setState<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n                        value\n                <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">props<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">children<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">state<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span>\n            Provider<span class=\"pl-kos\">,<\/span>\n            Consumer\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7528\u6211\u4eec\u5199\u7684 createContext \u66ff\u6362 React.createContext \u65b9\u6cd5\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u540c\u6837\u53ef\u4ee5\u8fd0\u884c\u3002<\/p>\n<p dir=\"auto\">\u5b83\u5176\u5b9e\u8ddf\u89e3\u51b3\u8001 Context API \u95ee\u9898\u7684\u65b9\u6cd5\u662f\u4e00\u6837\u7684\uff0c\u53ea\u4e0d\u8fc7\u662f\u505a\u4e86\u4e00\u5c42\u5c01\u88c5\u3002Consumer \u7ec4\u4ef6\u6784\u5efa\u7684\u65f6\u5019\u8fdb\u884c\u8ba2\u9605\uff0c\u5f53 Provider \u6709\u66f4\u65b0\u7684\u65f6\u5019\u8fdb\u884c\u53d1\u5e03\uff0c\u8fd9\u6837\u5c31\u8df3\u8fc7\u4e86 PureComponent  \u7684\u9650\u5236\uff0c\u5b9e\u73b0 Consumer \u7ec4\u4ef6\u7684\u66f4\u65b0\u3002<\/p>\n<h3 dir=\"auto\">createContext \u6e90\u7801<\/h3>\n<p dir=\"auto\">\u73b0\u5728\u6211\u4eec\u53bb\u770b\u770b\u771f\u7684 createContext \u6e90\u7801\uff0c<a href=\"https:\/\/github.com\/facebook\/react\/blob\/main\/packages\/react\/src\/ReactContext.js\">\u6e90\u7801\u4f4d\u7f6e<\/a>\u5728 <code class=\"notranslate\">packages\/react\/src\/ReactContext.js<\/code>\uff0c\u7b80\u5316\u540e\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import {REACT_PROVIDER_TYPE, REACT_CONTEXT_TYPE} from 'shared\/ReactSymbols';\n\nexport function createContext(defaultValue) {\n  const context = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    \/\/ As a workaround to support multiple concurrent renderers, we categorize\n    \/\/ some renderers as primary and others as secondary. We only expect\n    \/\/ there to be two concurrent renderers at most: React Native (primary) and\n    \/\/ Fabric (secondary); React DOM (primary) and React ART (secondary).\n    \/\/ Secondary renderers store their context values on separate fields.\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    \/\/ Used to track how many concurrent renderers this context currently\n    \/\/ supports within in a single renderer. Such as parallel server rendering.\n    _threadCount: 0,\n    \/\/ These are circular\n    Provider: null,\n    Consumer: null,\n\n    \/\/ Add these to use same hidden class in VM as ServerContext\n    _defaultValue: null,\n    _globalName: null,\n  };\n\n  context.Provider = {\n    $$typeof: REACT_PROVIDER_TYPE,\n    _context: context,\n  };\n\n  context.Consumer = context;\n\n\n  return context;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">import<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-c1\">REACT_PROVIDER_TYPE<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">REACT_CONTEXT_TYPE<\/span><span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">from<\/span> <span class=\"pl-s\">'shared\/ReactSymbols'<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">export<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createContext<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">defaultValue<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">context<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_CONTEXT_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c\">\/\/ As a workaround to support multiple concurrent renderers, we categorize<\/span>\n    <span class=\"pl-c\">\/\/ some renderers as primary and others as secondary. We only expect<\/span>\n    <span class=\"pl-c\">\/\/ there to be two concurrent renderers at most: React Native (primary) and<\/span>\n    <span class=\"pl-c\">\/\/ Fabric (secondary); React DOM (primary) and React ART (secondary).<\/span>\n    <span class=\"pl-c\">\/\/ Secondary renderers store their context values on separate fields.<\/span>\n    <span class=\"pl-c1\">_currentValue<\/span>: <span class=\"pl-s1\">defaultValue<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">_currentValue2<\/span>: <span class=\"pl-s1\">defaultValue<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c\">\/\/ Used to track how many concurrent renderers this context currently<\/span>\n    <span class=\"pl-c\">\/\/ supports within in a single renderer. Such as parallel server rendering.<\/span>\n    <span class=\"pl-c1\">_threadCount<\/span>: <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c\">\/\/ These are circular<\/span>\n    <span class=\"pl-c1\">Provider<\/span>: <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">Consumer<\/span>: <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">,<\/span>\n\n    <span class=\"pl-c\">\/\/ Add these to use same hidden class in VM as ServerContext<\/span>\n    <span class=\"pl-c1\">_defaultValue<\/span>: <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">_globalName<\/span>: <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Provider<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">$$typeof<\/span>: <span class=\"pl-c1\">REACT_PROVIDER_TYPE<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">_context<\/span>: <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">Consumer<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">;<\/span>\n\n\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f60\u4f1a\u53d1\u73b0\uff0c\u5982\u540c\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\u6d89\u53ca\u7684\u6e90\u7801\u4e00\u6837\uff0cReact \u7684 createContext \u5c31\u53ea\u662f\u8fd4\u56de\u4e86\u4e00\u4e2a\u6570\u636e\u5bf9\u8c61\uff0c\u4f46\u6ca1\u6709\u5173\u7cfb\uff0c\u4ee5\u540e\u7684\u6587\u7ae0\u4e2d\u4f1a\u6162\u6162\u89e3\u6790\u5b9e\u73b0\u8fc7\u7a0b\u3002<\/p>\n<h2 dir=\"auto\">React \u7cfb\u5217<\/h2>\n<p dir=\"auto\">\u8bb2\u89e3 React \u6e90\u7801\u3001React API \u80cc\u540e\u7684\u5b9e\u73b0\u673a\u5236\uff0cReact \u6700\u4f73\u5b9e\u8df5\u3001React \u7684\u53d1\u5c55\u4e0e\u5386\u53f2\u7b49\uff0c\u9884\u8ba1 50 \u7bc7\u5de6\u53f3\uff0c\u6b22\u8fce\u5173\u6ce8<\/p>\n<p dir=\"auto\">\u5982\u679c\u559c\u6b22\u6216\u8005\u6709\u6240\u542f\u53d1\uff0c\u6b22\u8fce star\uff0c\u5bf9\u4f5c\u8005\u4e5f\u662f\u4e00\u79cd\u9f13\u52b1\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/319'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/319<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Context \u672c\u7bc7\u6211\u4eec\u8bb2 Context\uff0cContext \u53ef\u4ee5\u5b9e\u73b0\u8de8\u7ec4\u4ef6\u4f20\u9012\u6570\u636e\uff0c\u5927\u90e8\u5206\u7684\u65f6\u5019\u5e76\u65e0\u9700\u8981\uff0c\u4f46\u6709\u7684\u65f6\u5019\uff0c\u6bd4\u5982\u7528\u6237\u8bbe\u7f6e \u4e86 UI \u4e3b\u9898\u3001\u5730\u533a\u504f\u597d\uff0c\u5982&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1419\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1419","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1419"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1419"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1419\/revisions"}],"predecessor-version":[{"id":2395,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1419\/revisions\/2395"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}