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

    正文概述 掘金(一只小萌新呀)   2021-02-02   471

    Redux填三个小坑

    三个React容易范的错误

    • store必须是唯一的,多个store是坚决不允许,只能有一个store空间
    • 只有store能改变自己的内容,Reducer不能改变
    • Reducer必须是纯函数

    Store必须是唯一的

    /store/index.js文件,只在这个文件中用createStore()方法,声明了一个store,之后整个应用都在使用这个store。

    import { createStore } from 'redux'  //  引入createStore方法
    import reducer from './reducer'    
    const store = createStore(
        reducer,
        window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()) // 创建数据存储仓库
    export default store   //暴露出去
    

    只有store能改变自己的内容,Reducer不能改变

    如果把业务逻辑写在了Reducer中,那改变state值的一定是Reducer,其实不是的,在Reducer中我们只是作了一个返回,返回到了store中,并没有作任何改变。

    Reudcer只是返回了更改的数据,但是并没有更改store中的数据,store拿到了Reducer的数据,自己对自己进行了更新。

    import {CHANGE_INPUT,ADD_ITEM,DELETE_ITEM} from './actionTypes'
    
    const defaultState = {
        inputValue : 'Write Something',
        list:[
            '锻炼身体',
            '慢跑一小时'
        ]
    }
    export default (state = defaultState,action)=>{
        if(action.type === CHANGE_INPUT){
            let newState = JSON.parse(JSON.stringify(state)) //深度拷贝state
            newState.inputValue = action.value
            return newState
        }
        //state值只能传递,不能使用
        if(action.type === ADD_ITEM ){ //根据type值,编写业务逻辑
            let newState = JSON.parse(JSON.stringify(state)) 
            newState.list.push(newState.inputValue)  //push新的内容到列表中去
            newState.inputValue = ''
            return newState
        }
        if(action.type === DELETE_ITEM ){ //根据type值,编写业务逻辑
            let newState = JSON.parse(JSON.stringify(state)) 
            newState.list.splice(action.index,1)  //push新的内容到列表中去
            return newState
        }
        return state
    }
    

    Reducer必须是纯函数

    什么是纯函数?

    纯函数定义:

    - 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。

    可以简单的理解为返回的结果是由传入的值决定的,而不是其它的东西决定的。

    比如下面这段Reducer代码。

    export default (state = defaultState,action)=>{
        if(action.type === CHANGE_INPUT){
            let newState = JSON.parse(JSON.stringify(state)) //深度拷贝state
            newState.inputValue = action.value
            return newState
        }
        //state值只能传递,不能使用
        if(action.type === ADD_ITEM ){ //根据type值,编写业务逻辑
            let newState = JSON.parse(JSON.stringify(state)) 
            newState.list.push(newState.inputValue)  //push新的内容到列表中去
            newState.inputValue = ''
            return newState
        }
        if(action.type === DELETE_ITEM ){ //根据type值,编写业务逻辑
            let newState = JSON.parse(JSON.stringify(state)) 
            newState.list.splice(action.index,1)  //push新的内容到列表中去
            return newState
        }
        return state
    }
    

    它的返回结果,是完全由传入的参数state和action决定的,这就是一个纯函数。

    常见错误 :

    比如在Reducer里增加一个异步ajax函数,获取一些后端接口数据,然后再返回,这就是不允许的(包括你使用日期函数也是不允许的),因为违反了调用参数相同,返回相同的纯函数规则。


    起源地下载网 » Redux填三个小坑

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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