zoukankan      html  css  js  c++  java
  • xml ui

    useReducer may be used as an alternative to useState.

    const [state, dispatch] = useReducer(reducer, initialState, lazyInitFunction)
    

    Ideal for complex state logic where there's a dependency on previous state values or a lotta state sub values

    const initialState = {  15 }
    const reducer = (state, action) => {
      switch (action) {
        case 'plus':
          return {  state.width + 15 }
        case 'minus':
          return {  Math.max(state.width - 15, 2) }
        default:
          throw new Error("what's going on?" )
      }
    }
    
    const Bar = () => {
      const [state, dispatch] = useReducer(reducer, initialState)
      return <>
        <div style={{ background: 'teal', height: '30px',  state.width }}></div>
        <div style={{marginTop: '3rem'}}>
            <button onClick={() => dispatch('plus')}>Increase bar size</button>
            <button onClick={() => dispatch('minus')}>Decrease bar size</button>
        </div>
        </>
    }
    render(Bar)
    

    以lazy函数返回设置初始状态

    const initializeState = () => ({
       100
    })
    // ✅ note how the value returned from the fn above overrides initialState below: 
    const initialState = {  15 }
    const reducer = (state, action) => {
      switch (action) {
        case 'plus':
          return {  state.width + 15 }
        case 'minus':
          return {  Math.max(state.width - 15, 2) }
        default:
          throw new Error("what's going on?" )
      }
    }
    
    const Bar = () => {
      const [state, dispatch] = useReducer(reducer, initialState, initializeState)
      return <>
        <div style={{ background: 'teal', height: '30px',  state.width }}></div>
        <div style={{marginTop: '3rem'}}>
            <button onClick={() => dispatch('plus')}>Increase bar size</button>
            <button onClick={() => dispatch('minus')}>Decrease bar size</button>
        </div>
        </>
    }
    render(Bar)
    

    模拟this.setState的merge行为

    const initialState = {  15 }
    const reducer = (state, newState) => ({
      ...state,
       newState.width
    })
    
    const Bar = () => {
      const [state, setState] = useReducer(reducer, initialState)
      return <>
        <div style={{ background: 'teal', height: '30px',  state.width }}></div>
        <div style={{marginTop: '3rem'}}>
            <button onClick={() => setState({ 100})}>Increase bar size</button>
            <button onClick={() => setState({ 3})}>Decrease bar size</button>
        </div>
        </>
    }
    render(Bar)
    

    https://react-hooks-cheatsheet.com/

  • 相关阅读:
    752.打开转盘锁
    733. 图像渲染
    704.二分查找
    leetcode 87 Scramble String
    找实习总结
    leetcode 44 Wildcard Matching
    Linux,网络编程接口记录
    leetcode 172 Factorial Trailing Zeroes
    leetcode 168 Excel Sheet Column Title
    leetcode 65 Valid Number
  • 原文地址:https://www.cnblogs.com/Searchor/p/13877937.html
Copyright © 2011-2022 走看看