2017-01-19 13 views
0

Я пытаюсь заморозить ключи внутри моего объекта, чтобы не случайно их обновлять, поскольку я использую React Native (0.34.0) и Redux, поэтому мне нужно используйте чистые функции.React Native 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). На какой платформе вы тестируете это? Кроме того, попробуйте добавить '' use 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.