Обрабатывайте данные вложенных состояний в react native с помощью setState

#javascript #react-native

Вопрос:

У меня есть приложение для меню ресторана, владелец ресторана, когда добавляет пункт в меню, есть опция, где он может настроить пункт меню, чтобы клиент мог выбрать один из них перед размещением заказа, перед добавлением его в меню, настройка будет включать в себя пополнение для пункта меню, поэтому я дал владельцу ресторана возможность ввести номер, и на основе этого номера будут отображаться текстовые данные для добавления пополнений, например, если владелец введет номер 2, будут отображаться два представления, в каждом представлении есть два ввода текста, один для имени и один для цены, таким образом, возникает вопрос, как сохранить введенные данные в каждом TextInput с помощью setState, в то время как эта структура состояния будет выглядеть так:

const [topups, setTopups] = useState({required: [] })

из каждого представления, в котором есть два {'name',price} текстовых ввода, они будут храниться внутри required в состоянии topups

Я сделал следующее: вот как я отображаю текстовые данные на основе введенного числа:

 {numberOfTopupsItems > 0 amp;amp;
   <View style={{ borderRadius: 5, borderColor: colors.black, borderWidth: 1, padding: 5 }}>
       {[...Array(Number(numberOfTopupsItems)).keys()]
             .map(el =>
               <View >
                  <Text> topup item no. {el   1}</Text>
                  <Input
                         label="Enter name of topup"
                         mode='outlined'
                         onChangeText={text => setName(text)}
                   />
                   <Input
                         label="Enter Price of topup"
                          mode='outlined'
                          keyboardType={'decimal-pad'}
                          autoCorrect={false}
                          onChangeText={text => setPrice(text)}
                    />


                </View>
          )}
     </View>
  }
 

из каждого текстового ввода я устанавливаю его значение в состоянии один для имени и один для цены, и я изменяю основное состояние topups , используя этот код:

   useEffect(() => {
     
        const newRTopup = Object.assign({}, topups, { required: [name, price] })
        setTopups(newRTopup)

    }, [name, price])
 

если пользователь ввел номер 1 и установил значения для имени и цены, все в порядке, однако, когда я ввожу число больше одного, у меня будет более одного представления для текстовых данных имени и цены, то это не работает, так как он удаляет предыдущее значение и добавляет последнее значение в состояние, я обнаружил, что сначала должен использовать индекс для хранения значения, но я понятия не имею, как это сделать.

Ответ №1:

Существует несколько способов обработки этого варианта использования.

Один из них заключается в инициализации элементов пополнения при numberOfTopupsItems изменениях:

 useEffect(()=>{
    let top = {required: []}
    if (numberOfTopupsItems) {
        for (let i = 0; i < numberOfTopupsItems; i  ){
            top.required.push({name: null, price: null})
        }
    } 
    setTopups(top)
    
},[numberOfTopupsItems])
 

Затем вы можете построить свое представление на основе инициализированного значения и использовать индекс для изменения состояния:

 {numberOfTopupsItems > 0 amp;amp;
   <View style={{ borderRadius: 5, borderColor: colors.black, borderWidth: 1, padding: 5 }}>
       {topups.required
             .map((el,i) => // i is the array index
               <View >
                  <Text> topup item no. {i   1}</Text>
                  <Input
                         label="Enter name of topup"
                         mode='outlined'
                         onChangeText={text => {
                            let newState = {...topups};
                            topups.required[i].name = text;
                            setTopups(newState)
                         }}
                   />
                   <Input
                         label="Enter Price of topup"
                          mode='outlined'
                          keyboardType={'decimal-pad'}
                          autoCorrect={false}
                          onChangeText={text => {
                            let newState = {...topups};
                            topups.required[i].price = text;
                            setTopups(newState)
                         }}
                    />


                </View>
          )}
     </View>
  }
 

Комментарии:

1. вау, все прошло так гладко, я действительно очень ценю вашу помощь. Спасибо. принятый ответ 🙂