2017-01-19 33 views
0

我试图冻结我的对象内的键,以便我不会意外更新它们,因为我使用React Native(0.34.0)和Redux,所以我需要使用纯功能。反应本机Object.freeze不工作

然而,使用deepFreeze npm软件包,以及尝试Object.freeze(...)它仍然让我改变我的密钥在下面的代码,任何帮助将不胜感激!

var Immutable = require('immutable'); 
var deepFreeze = require('deep-freeze'); 

import * as types from '../actions/actionTypes'; 

const initialState = { 
    customBackgroundColour: '#f7f7f7' 
}; 

export default function backgroundColour(state = initialState, action = {}) { 

switch (action.type) { 
    case types.SET_BACKGROUND_COLOUR: 

     deepFreeze(state); 
     deepFreeze(action); 

     console.log(Object.isFrozen(state)); // true 
     console.log(state.customBackgroundColour); // #f7f7f7 

     state.customBackgroundColour = 'red'; 
     console.log(state.customBackgroundColour); // red 

     return { 
      ...state, 
      customBackgroundColour: action.payload.colour 
     }; 
    default: 
     return state; 
    } 
} 
+0

Object.freeze对我来说工作正常(在iOS上测试过)。你在测试什么平台?此外,请尝试在文件顶部添加''strict strict'',以查看变异的冻结对象是否会引发错误 - 应该采用严格模式。 – jevakallio

回答

0

https://github.com/facebook/react-native/issues/5316

严格的模式不被默认启用,因为 Facebook有一些模块是不符合严格的模式 包装者也transpiles node_modules下的文件,所以任何库没有严格的书面模式会中断。

我使用Babel的转换严格插件来执行此操作,它对我来说工作正常。 https://babeljs.io/docs/plugins/transform-strict-mode/

请注意,如果您包含非严格模块,它可能会中断,或者Facebook将来会在ReactNative中包含非严格模块。