Ну да, конечно нажимая на логи кнопки []
.При этом:
<Child id={item.id} getItems={getItems}/>
getItem
оценивается как функция, которая регистрирует элементы, и элементы []
, поэтому регистрируется []
.Причина, по которой он не регистрирует элементы new , заключается в том, что во время написания кода React не может точно знать, когда следует обновить компонент, поскольку на этапе рендеринга не используется переменная.
Обычно плохая практика использовать элементы JSX вне Render, потому что они не совсем обычные переменные JS с предсказуемым поведением.Тот факт, что он компилируется, является скорее хаком , чем функцией .
Сохранение ванильных переменных в состоянии и предоставление компонентам возможности выполнять JSX-рендеринг.Этот подход немного отличается от вашего, но работает как положено, так как нажатие на любую кнопку регистрирует все элементы:
const fakeApiCall = () => Promise.resolve([
{id: 10},
{id: 20},
{id: 30},
]);
const Parent = () => {
const [items, setItems] = React.useState([]);
React.useEffect(() => {
fakeApiCall().then(setItems)
})
const getItems = () => console.log(items);
return (
<div>
{items.map(item => (
<Child
id={item.id}
key={item.id}
getItems={getItems}/>
))}
</div>
)
}
const Child = ({id, getItems}) => (<button onClick={getItems}>{id}</button>);
window.onload = () => ReactDOM.render(<Parent/>, document.querySelector('#root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>