Массив, переданный в реквизитах, отображается как пустой

#reactjs

#reactjs

Вопрос:

Я не могу разобраться в этом поведении. В сообщении журнала консоли компонента приложения arr отображается как массив с 2 элементами, как и ожидалось. Однако, когда он передается дочернему компоненту, он отображается как пустой массив. Если вместо того, чтобы использовать splice непосредственно для массива pokemon, я сначала распространяю его на новый массив, а затем использую splice для этого, он работает нормально.

Очевидно, это потому, что splice изменяет массив напрямую, что противоречит правилу неизменности React, но я не могу понять, почему это имеет значение, когда массив pokemon не является тем, что передается дочернему компоненту.

 const pokemon = [
  {
    name: 'pikachu'
  },
  {
    name: 'raichu'
  }
]

export default function App() {
  const arr = pokemon.splice(0,2)
  console.log(arr)
  return (
    <div className="App">
      <ChildComponent example={arr} />
    </div>
  );
}

const ChildComponent = (props) => {
  console.log(props);
  return (
    <div>
      hi
    </div>
  )
}
 

Ответ №1:

На самом деле причина, по которой вы сталкиваетесь с этим странным поведением, заключается в том, что ваш код App обернут StrictMode, который дважды отображает ваш компонент.

Сначала Splice возвращает удаленные элементы, затем у pokemon не осталось ни одного после первого сращивания. arr печатает эти удаляемые элементы. Поскольку ваше приложение обернуто StrictMode (приложение выполняется снова), pokemon (который теперь является пустым массивом) снова объединяется, а дочерний элемент имеет пустой массив, печатающий пустой массив.

Если вы удалите StrictMode перенос, ваш код будет вести себя так, как ожидалось, и оба console.log будут печататься правильно.

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

1. Это было все. Как вы и сказали, без StrictMode он функционирует так, как ожидалось. Ожидается ли, что консоль. войдите в приложение, чтобы компонент выполнялся только при первом рендеринге? Разве это не должно также выполняться на 2-м рендеринге, после объединения пустого массива, и приводить к дополнительному сообщению журнала о пустом массиве ‘arr’?

2. Нашел этот пост , который объясняет это. «Оказывается, что React захватывает консоль. регистрирует и заменяет его функцией, которая ничего не делает на втором проходе рендеринга »