2017-01-03 4 views
2

В нашем 5.3 (не 6.x) приложение Redux формы, я хочу вынести <input type="checkbox" /> так:В форме Redux, как я могу установить начальное значение проверенного свойства флажка?

// In some cases, fieldHelper.checked is initially undefined. Then, when the 
// user clicks one of the checkboxes, fieldHelper.checked is 
// explicitly set to true or false. This change from one of the component's 
// props being undefined to having a value causes a React warning; see 
// http://stackoverflow.com/a/38015169/473792 and 
// https://facebook.github.io/react/docs/forms.html#controlled-components 
// So to prevent that warning, we do a quick null check on 
// fieldHelper.checked and replace it with false explicitly if it is 
// undefined before rendering the checkbox. 
const fieldHelper = this.props.field['checkbox']; 
const checked = fieldHelper.checked || false; 

const modifiedFieldHelper = Object.assign({}, fieldHelper); 
delete modifiedFieldHelper.checked; 

return (
    <input 
    checked={checked} 
    {...modifiedFieldHelper} 
    /> 
); 

}

Как отмечено в комментарии, в моей тестовой среде, this.props.field['checkbox'].checked является undefined сразу после установки <input>. В результате, когда мои тесты изменить значение this.props.field['checkbox'].checked, я получаю следующее предупреждение:

Внимание: ApplicantForm меняется неконтролируемый вход типа флажок, чтобы управляться. Элементы ввода не должны переключаться с неконтролируемого на управляемый (или наоборот). Решите, используя управляемый или неконтролируемый входной элемент для времени жизни компонента.

... Если я явно не установить checked prop на <input> в false вместо undefined, как показано в фрагменте кода я написал выше.

Вместо того, чтобы использовать эту нулевую проверку, я хотел бы установить начальное значение this.props.fields['checkbox'].checked перед выполнением моих тестов. I know I can set the initial value of fields in Redux Form. Есть ли способ установить начальное значение вспомогательного свойства, такого как свойство checked, которое также управляет формой Redux?

+0

Вы пытались использовать логическое значение? – gustavohenke

+0

Похоже, что в Redux-Form есть некоторые ошибки с тем, как это работает с флажками, поэтому я, возможно, столкнулся с этим: https://github.com/erikras/redux-form/issues/334 – Kevin

ответ

1

Вы можете создать простой условный зарегистрированном атрибут так, что, когда не определено значение, которое вы просто возвращает ложь:

<input 
    type="checkbox" 
    checked={typeof this.props.fields['checkbox'].checked == 'undefined'?false:this.props.fields['checkbox'].checked} 
    onClick={() => {... your onClick code ...}} /> 
0

Я никогда не использовал Redux-Form, но для отображения значения по умолчанию для флажка по умолчанию React вам нужно будет использовать атрибут defaultChecked. Он принимает логическое значение. не

<input type="checkbox" defaultChecked={/*bool*/} /> 
+0

К сожалению, Я помогу мне. Причина, по которой я хочу установить начальное значение 'checked' prop, состоит в том, что я хочу, чтобы флажок был контролируемым компонентом, но в некоторых ситуациях Redux Form изначально устанавливает свойство' checked' неопределенным, предоставляя мне предупреждение. У меня есть более подробная информация о том, что я хочу сделать в [более раннем, более длинном проекте моего вопроса] (http://stackoverflow.com/revisions/41452053/1). – Kevin

0

флажков не отличаются от текстовых входов. Вы все еще можете просто разрушить полевой объект в своем <input>. Посмотрите, как значение employed используется в v5.3.3Simple Form Example.

<input type="checkbox" {...myField}/> 

Redux Форма обнаружит, что это флажок (на самом деле он определяет для boolean значений) и использовать checked опору.

+0

Я понимаю, как разрушить объект поля в ''. То, что я хочу сделать, - установить начальное значение, которое содержит объект поля. – Kevin

+0

А, ладно. Я не видел твое последнее предложение. Нет, если ваш вход контролируется с помощью Redux-Form, вам нужно будет инициализировать его значение через систему initialValues. –