最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • useReducer

    正文概述 掘金(wanger想要吃芋圆)   2020-11-27   442

    一 介绍

    1. useReducer 是 useState 的替代方案,是 useState 的复杂版。
    2. 在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。

    二 示例一:数字加或乘任意数字

    import React, {useReducer} from 'react';
    import ReactDOM from 'react-dom';
    
    
    const initial = {n: 1};
    //把对数据的操作封装起来
    const reducer = (state, action) => {
        if (action.type === 'add') {
            return {n: state.n + action.number};
        } else if (action.type === 'multi') {
            return {n: state.n * action.number};
        } else {
            throw new Error('没有对应操作');
        }
    };
    
    
    const App = () => {
        //将初始值和所有操作传给useReducer,已得到读写API
        const [state, dispatch] = useReducer(reducer, initial);
        return (
            <>
                <div>
                    {/*读数据*/}
                    {state.n}
                    {/*写数据*/}
                    <button onClick={() => dispatch({type: 'add', number: 10})}>+10</button>
                    <button onClick={() => dispatch({type: 'multi', number: 5})}>x5</button>
                </div>
            </>
        );
    };
    
    
    ReactDOM.render(
        <App/>,
        document.getElementById('root')
    );
    

    三 示例二:表单

    import React, {useReducer} from 'react';
    import ReactDOM from 'react-dom';
    
    
    const initialFormDate = {
        name: '芋圆',
        color: '紫色',
        count: '15'
    };
    
    const reducer = (state, action) => {
        switch (action.type) {
            case 'patch':
                return {...state, ...action.newFormDate};
            case 'reset':
                return initialFormDate;
            default:
                throw new Error('错误');
        }
    };
    
    
    const App = () => {
        //将初始值和所有操作传给useReducer,已得到读写API
        const [formData, dispatch] = useReducer(reducer, initialFormDate);
    
        const onSubmit=()=>{
    
        }
        const onReset=()=>{
            dispatch({type:'reset'})
        }
        return (
            <form onSubmit={onSubmit} onReset={onReset}>
                <div>
                    <div>
                        <label>名称
                            <input value={formData.name} onChange={e=>dispatch({type:'patch',newFormDate:{name:e.target.value}})} />
                        </label>
                    </div>
                    <div>
                        <label>颜色
                            <input value={formData.color} onChange={e=>dispatch({type:'patch',newFormDate:{color:e.target.value}})} />
                        </label>
                    </div>
                    <div>
                        <label>数目
                            <input value={formData.count} onChange={e=>dispatch({type:'patch',newFormDate:{count:e.target.value}})} />
                        </label>
                    </div>
                    <div>
                        <button type='submit'>提交</button>
                        <button type='reset'>重置</button>
                    </div>
                    {JSON.stringify(formData)}
                </div>
            </form>
        );
    };
    
    
    ReactDOM.render(
        <App/>,
        document.getElementById('root')
    );
    

    四 总结

    1. 创建初始initialState
    2. 创建所有操作reducer(state,action)
    3. 传给useReducer,得到读写API
    4. 调用写API,参数要包含{type:'操作类型'}

    起源地下载网 » useReducer

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元