React Context 函数组件的主流写法

基础写法

// 定义Context - index.js
import React, { createContext } from 'react';
import colors from './color-data';
import { render } from 'react-dom';
import App from './App';

export const ColorContext = createContext(); // 导出Context

render(
  <ColorContext.Provider value={{ colors }}>
    <App />
  </ColorContext.Provider>,
  document.getElementById("root")
)

// 使用Context
import React, { useContext } from 'react';
import { ColorContext } from './index.js';
import Color from './Color';

export default function ColorList() {
  const { colors } = useContext(ColorContext);

  if (!colors.length) return <div>No Colors Listed. (Add a Color)</div>;

  return (
    <div>
      {
      	colors.map(color => <Color key={color.id} {...color} />)
      }
    </div>
  )
}

进阶写法 - 响应式的Context

// 定义Context
import React, { createContext, useState } from 'react';
import colorData from './color-data.json';

const ColorContext = createContext();

export default function ColorProvider({ children }) {
  const [colors, setColors] = useState(colorData);

  return (
    <ColorContext.Provider value={{ colors, setColors }}>
      {children}
  	</ColorContext.Provider>
  )
}

// 定义Context
import React, { createContext, useState } from 'react';
import colorData from './color-data.json';

const ColorContext = createContext();

export default function ColorProvider({ children }) {
  const [colors, setColors] = useState(colorData);

  const rateColor = (id, rating) => setColors(...);
  const removeColor = id => setColors(...);
  const addColor = (title, color) => setColors(...);

  return (
    <ColorContext.Provider value={{ colors, rateColor, removeColor, addColor }}>
      {children}
  	</ColorContext.Provider>
  )
}

最好不要把setColors传给消费组件,因为变更操作有多种,应该为不同操作定义函数,只开放允许用户执行的修改操作函数


主流写法 - 自定义钩子封装Context

// color-hooks.js
import React, { createContext, useState, useContext } from 'react';
import colorData from './color-data.json';

const ColorContext = createContext();

export const useColors = () => useContext(ColorContext);

import React, { useContext } from 'react';
import { ColorProvider } from './color-hooks.js';
import { render } from 'react-dom';
import App from './App';

render(
  <ColorProvider>
    <App />
  </ColorProvider>,
  document.getElementById("root")
)

// 使用Context
import React, { useContext } from 'react';
import Color from './Color';
import { useColors } from './color-hooks';

export default function ColorList() {
  const { colors } = useColors();

  return (...)
}

内容出自《React学习手册(第二版)- 中国电力出版社》,强烈推荐*****

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值