zoukankan      html  css  js  c++  java
  • Object.assign()遇到的问题分析

    概念

    Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。语法如下:

    Object.assign(target, ...sources)
    

    Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象身上。

    浅拷贝

    使用这个方法有个最需要注意的地方就是它是浅拷贝,也就是对于嵌套对象来说使用Object.assign会直接替换掉。我在redux的项目中处理reducer中经常需要改变嵌套对象中的某个属性时候,最开始没有注意就出了错误。

    下面是我的reducer代码:

    const initialState = {
        mainMenu: "marketIndex",
        selectMenu: "equityMarket",
        externalInfoEchartsImage: "line",
        equityMarket: {
            tableData: [],
            refreshTable: false,
            tableFetching: true,
            rowIndex: 0,
            echartsData: [],
            echartsFetching: true,
        },
    }
    
    export default function(state = initialState, action) {
        switch (action.type) {
            case types.SWITCH_EXTERNAL_MAIN_MENU:
                return Object.assign({}, state, {
                    mainMenu: action.mainMenu 
                });
            case types.SELECT_EXTERNAL_SUB_MENU:
                return Object.assign({}, state, {
                    selectMenu: action.selectMenu 
                });
            case types.REFRESH_EXTERNAL_DATA:
                return {
                    ...state,
                    [action.selectMenu]: {
                        ...state[action.selectMenu],
                        refreshTable: action.refreshTable,
                    }
                };
                
                ...
    

    mainMenu: "marketIndex"这种使用简单数据类型的,就可以直接使用Object.assign来改变属性的值。

    	Object.assign({}, state, {
             mainMenu: action.mainMenu 
        });
    

    而有嵌套数据类型的equityMarket

       equityMarket: {
            tableData: [],
            refreshTable: false,
            tableFetching: true,
            rowIndex: 0,
            echartsData: [],
            echartsFetching: true,
        },
    

    如果直接使用

    	Object.assign({}, state, 
    		equityMarket:{
             refreshTable: action.refreshTable,
        });
    

    那么就是直接将整个equityMarket替换了,因此需要用...扩展操作符来实现,或者用一些其他的插件等。

    参考资料

    1.详细的用法介绍

  • 相关阅读:
    百度地图生成器添加标注不显示
    为web文件夹添加IIS应用程序池用户权限
    SSL证书 .pem转.pfx
    sql获取表的所有字段及属性
    sql server不用安装sql管理工具开启sa
    asp.net mvc+webuploader大文件分片上传
    将WinForm程序(含多个非托管Dll)合并成一个exe的方法
    手机访问网站自动跳转到手机版
    c++和cuda混合编程 实现传统神经网络
    leetcode 338
  • 原文地址:https://www.cnblogs.com/lijie33402/p/6421331.html
Copyright © 2011-2022 走看看