Как правильно изменить значение реквизита в компонентах Redux/React?

У меня есть массив, который поставляется в виде строки (и не могу изменить его сейчас). Я получаю String, и мне нужно выполнить JSON.parse() над строковым массивом, чтобы снова сделать его массивом. Я не могу сделать это в функции componentDidMount, потому что не рекомендуется использовать компонент состояния в Redux. Я мог бы сделать это с помощью функции рендеринга, но, насколько я понимаю, это также не лучший способ изменять значения там.

render() {
if (typeof this.props.detectedPersonListJson == 'string'){
      var array= JSON.parse(this.props.detectedPersonListJson);
    }  
 return (
      <div> 
    array.map(...)
</div>

Так как же мне управлять мутацией реквизита в презентационном компоненте Redux? Спасибо!

2 ответа

Если вы используете redux, я предполагаю, что вы уже используете функцию mapStateToProps, вы можете проанализировать ее и сделать ее доступной для компонента React

function mapStateToProps(state) {
    var array;
    if (typeof state.detectedPersonListJson == 'string'){
      array= JSON.parse(state.detectedPersonListJson);
    }  
    return {
         detectedPersonListJson: array
    }

}

В противном случае вы можете сохранить реквизит как переменную состояния, для этого вам необходимо выполнить синтаксический анализ и установить setState в componentWillReceiveProps а также componentWillMount/componentDidMount функции жизненного цикла с componentWillMount вызывается только один раз и componentWillReceiveProps вызывается на каждом рендере впоследствии.

Прежде всего, я бы точно не делал мутации в функции рендеринга, так как она будет часто вызываться. Я бы посоветовал прочитать начальные реквизиты в ComponentDidMount, где вы соответствующим образом их мутируете и сохраните во внутреннем состоянии. После этого, если значение может измениться, я бы порекомендовал сделать ту же мутацию в ComponentWillReceiveProps. Я также не верю, что это очень плохая практика - мутировать данные реквизиты, чтобы использовать их. Просто постарайтесь свести к минимуму мутации и не допускать их в функцию рендеринга.

Другие вопросы по тегам