React/Redux не может получить доступ к свойствам объекта в массиве

#reactjs #redux #react-redux #redux-toolkit

Вопрос:

Работа с react и инструментарием redux.

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

Записи формы относятся к следующим значениям с сохранением состояния:

   const [name, setName] = useState('');
  const [imageURL, setImageURL] = useState('');
  const [brand, setBrand] = useState('');
  const [category, setCategory] = useState('');
  const [description, setDescription] = useState('');
  const [barcode, setBarcode] = useState('');
  const [countInStock, setCountInStock] = useState('');
  const [message] = useState(null);
  const [uploading, setUploading] = useState(false);
  const [uploadFile, setupLoadFile] = useState('');
 

Я не хочу, чтобы люди создавали свои собственные категории, поэтому у меня есть отдельная таблица категорий mongodb, которую я заполняю в форме, подобной этой

           <Form.Group controlId='category'>
            <Form.Label>Category</Form.Label>
            <Form.Control
              as='select'
              type='category'
              placeholder='enter Category'
              value={category}
              onChange={(e) => setCategory(e.target.value)}>
              {categories.map((category) => {
                return <option key={category._id}>{category.name}</option>;
              })}
            </Form.Control>
          </Form.Group>
 

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

Я попытался решить эту проблему двумя способами:

  1. Установите категорию триггера формы при загрузке с категорией, которая отображается по умолчанию (это не сработало).
  2. получите имя первой категории и добавьте его в useState следующим образом:
   const categories = useSelector(getAllCategories);
  let firstCat = categories[0]; //this works
  let firstCatName = firstCat.name; //this fails
  const [category, setCategory] = useState(firstCatName)
 

Этот подход терпит неудачу, потому что по какой-то причине попытка получить имя первой категории вызывает ошибку «не удается найти имя свойства неопределенное», хотя объект есть, и я могу отобразить массив категорий в форме.

Есть идеи, что я здесь делаю не так?

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

1. Привет, Аджит! Я получаю массив с 7 объектами в нем (по одному для каждой категории)

2. Да, извините, что я это сделал и сделал репост выше, я получаю массив с объектами для каждой категории

3. Нет проблем, вот образец: (8) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] 0: {_id: «60b48c507d68085a5c99eace», название: «Вечеринка», описание: «Вещи для вечеринки», __v: 0, Дата создания: «2021-05-31T07:12:16.267 Z», …} 1: {_id: «60b48c507d68085a5c99ead1», название: «Кухня», описание: «Положите в них жидкости. Или ручки.», __v: 0, создано: «2021-05-31T07:12:16.268 Z», …} …

4. это сработало, спасибо! Я не знал, что вы можете использовать эффект использования дважды на одном экране!

5. @AjeetShah Пожалуйста, добавьте свой комментарий в качестве ответа, чтобы он был выбран в качестве правильного ответа, и закройте вопрос. Спасибо!

Ответ №1:

От @Ajeet Shah

 useEffect(() => { 
if (categories.length > 0) { 
setCategory(categories[0].name) 
} }, [categories])
 

Я не понимал, что вы можете использовать useEffect дважды на одной странице, очевидно, вы можете!

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

1. Вы можете использовать столько useEffect , сколько вам кажется наилучшим для вашего приложения. Вам следует ознакомиться с официальной вводной статьей: reactjs.org/docs/…