#javascript #arrays #reactjs #react-native
#язык JavaScript #массивы #реагирует на #реагировать-родной
Вопрос:
У меня есть вложенный массив объектов, у каждого объекта есть вложенный options
массив, подобный этому.
const [formFields, setFormFields ] = useState({ formTitle: '', fields: [ {name: 'country', val: '', type: 'radio', options: ['Japan', 'Korea', 'usa'] }, {name: 'state', val: '', type: 'select', options: ['texas', 'florida']}, {name: 'location', val: '', type: 'text', options: []}, ]})
Каждый из элементов во вложенном options
массиве должен быть значением в текстовом вводе, которое можно редактировать. Я хочу иметь возможность добавлять/удалять/редактировать эти значения внутри текстового ввода одним нажатием кнопки. Пожалуйста, как я смогу этого достичь?
мой код
lt;Containtergt; {formFields.fields.map((field, index) =gt; ( lt;View key={index}gt; lt;Viewgt; lt;TextInput onChangeText={(value ) =gt; { onChange({name: field.name, value }); }} value={field.name} /gt; lt;/Viewgt; {(field.type === 'select' || field.type === 'radio') amp;amp; ( lt;gt; {field.options.map((option) =gt; ( lt;TextInput value={option} onChangeText={(value ) =gt; { onChange({name: field.options, ...field.options, value }); }} /gt; lt;Text onPress={removeOption}gt;Xlt;/Textgt; ))} lt;Button title="add option" /gt; lt;/gt; ) } lt;IconButton icon="delete" onPress={handleRemoveField} /gt; lt;/Viewgt; ))} lt;Button onPress={handleAddField} title="Add" /gt; lt;/Containtergt;
Комментарии:
1. В вашем
onChangeText
вам захочется позвонитьsetFormFields
.
Ответ №1:
Добавление и удаление реализации:
onAdd (index,value) { const fields = formFields.fields.map((field,i) =gt; { if (i==index) { const options = [...field.options,value] return {...field, options} } return field }) setFormFields( { ...formFields, fields } ) } onRemove (index,value) { const fields = formFields.fields.map((field,i) =gt; { if (i==index) { const options = field.options.filter((item) =gt; item != value) return {...field, options} } return field }) setFormFields( { ...formFields, fields } ) }
Комментарии:
1. Большое спасибо. Это отлично работает. Но как мне изменить значения с помощью onChange? ` {поле.параметры.карта((опция) =gt; ( gt;lt;Значение ввода текста={опция} onChangeText={(значение ) =gt; { onChange({имя: поле.параметры, …поле.параметры, значение }); }} /lt;значение ввода текста={опция} onChangeText={(значение ) =gt;gt; )} `
Ответ №2:
// in constructor this.onChange = this.onChange.bind(this) // in class onChange (index,value) { this.setState(state =gt; { const fields = state.fields.map((field,i) =gt; { if (i==index) field.val = value return field }) return { ...state, fields } }) } // in component onChangeText( (e) =gt; onChange(index, e.target.value) )
Комментарии:
1. Спасибо за это. Но то, что я хотел сделать, — это добавлять и удалять элементы в
field.options
массиве. И я хочу сделать это с помощью крючков react useState. Я действительно буду рад, если вы сможете помочь с этим.
Ответ №3:
Для изменения стоимости:
onChange (index,value) { const fields = formFields.fields.map((field,i) =gt; { if (i==index) field.val = value return field }) setFormFields({ ...formFields, fields }) } ... // somewhere in input element lt;TextInput ... onChangeText={(e) =gt; onChange(index,e.target.value)} .. /gt;
Комментарии:
1. Кажется, что все в порядке, но я получаю ошибку: неопределенный не является объектом (оценка e.target.value)
2. зависит от поведения TextInput, кажется, что он передает значение без события, в этом случае просто напишите: onChangeText={(значение) =gt; onChange(индекс,значение)}