【Day 23】React 关於 Hook(3)

关於 Hook 的方法与实作

useContext

useContext 可以使元件跨越层级直接传递变量,与 redux 不同的是,useContext 解决的是元件间传值问题,redux 则是统一控管状态

下方程序是以计数器为例,在一开始调用 createContext()方法建立 Context,而透过 <Context.Provider>把需要传递的资料带入 Context 中,在 Counter 中可以藉由useContext(CountContext) 去取得 Provider 带进来的内容。

import React, { useState, useContext, createContext } from 'react';

const CountContext = createContext();

function Counter() {
  // 
  let count = useContext(CountContext)
  return (<h2>{count}</h2>)
}

function Example() {
  const [ count, setCount ] = useState(0);
  return (
    <div>
      <p>你已经点击了{count}次</p>
      <button onClick={() => {setCount(count+1)}}>点击</button>
      <CountContext.Provider value={count}>
        <Counter />
      </CountContext.Provider>
    </div>
  )
}

export default Example

useReducer

Javascript 里 Reducer 的延伸,在 Redux 里也有提及,是一个纯函数(state, action) => state
可以透过 action 的传递,更新逻辑的 State

还记得 Redux 里提的 Reducer?

下方程序就是 Reducer,由 State 与 Action 组成,经由 Action 的类型去回覆 State 的变化

function calculateReducer(state, action) {
    switch(action.type) {
      case 'ADD':
        return state + 1;
      case 'SUB':
        return state - 1;
      default:
        return state;
    }
}

useReducer 如何使用?

下方程序就是以计数器为例子,眼尖的读者会发现其实写法与 Redux 真的差不多

档案位置 src/Example.js:

import React, { useReducer } from 'react';

function Example() {
  const [ count, dispatch ] = useReducer((state, action) => {
    switch (action){       // 这里要注意,不是使用 action.type 而是使用 action 
      case 'ADD':
        return state + 1
      case 'SUB':
        return state - 1
      default:
        return state
    }
  }, 1000)   // 预设 count 初始值为 1000
  return (
    <div>
      <h2>现在分数是 {count} </h2>
      <button onClick={()=>dispatch('ADD')}>增加</button>
      <button onClick={()=>dispatch('SUB')}>减少</button>
    </div>
  )
}

export default Example

结论

  • 介绍了 Hook 的方法:useContext、useReducer

/images/emoticon/emoticon38.gif


<<:  DAY28-VSCODE简写

>>:  iris的middleware

[职涯]留任还是离职?看完这篇後再做决定!

钱,没给到位;心,委屈了。 ── 马云 在这个快速变迁的世代,绝大多数人都不可能在一间公司终老;但...

day 17 - 利用 interface 来mock外部回应

到目前为止所跑的测试都是利用 docker 在本机run scylla & redis 测试...

[Day14]ISO 27001 标准:资源传达

今天一样是 ISO 硬硬的标准,第七节 资源 及 传达。 通常分切成【人力资源安全】及【文件化资讯】...

EP 18 Search and SearchBar design in TopStore App

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

【Day 8】Cloud x AWS x 李家同教授的最终归宿

tags: 铁人赛 AWS Cloud 概述 碎念时间 今天来玩玩 AWS (Amazon Web ...