Ну да, конечно, нажимая на кнопки журналов []
. В этом:
<Child id={item.id} getItems={getItems}/>
getItem
оценивается как функция, которая регистрирует элементы, и элементы []
, поэтому []
регистрируется. Причина, по которой он не регистрирует новые элементы , заключается в том, что во время написания вашего кода 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>
Он не является частью LINQ - он существовал в .NET 2.0 задолго до LINQ. Он похож на LINQ, но я бы не сказал, что он является частью LINQ.
С другой стороны, если вы реализуете свой собственный метод расширения IEnumerable
ForEach
(например, в MoreLINQ), что можно рассматривать как нестандартный оператор LINQ ...
Linq означает «языковой интегрированный запрос». Чтобы действительно «использовать» linq, вам нужна конструкция, похожая на эту: гарантировать свое собственное модное слово. Сказать, что вы можете использовать лямбда-выражения, на самом деле это не так. Например, этот образец. Вы могли бы использовать linq, но почему, когда это так же хорошо и намного короче:
var result = words.Where(w => w.Length < 5);
ForEach - это не LINQ, это просто метод, который принимает делегата. Начиная с версии .NET 2.0.
Принятие делегата не делает его LINQ.
Foreach - это не метод LINQ, это не член Enumerable
или Queryable
, и для него нет синтаксиса понимания.
И, самое главное, он изменяет источник (список), который не является чем-то LINQ объектам.
Я бы сказал «Нет».
В приведенном вами примере вы не используете LINQ. Метод ForEach - это просто хороший способ перебирать элементы вашего перечислимого типа данных без явной записи цикла.
Если вы пытаетесь оправдать LINQ в качестве ключевого слова резюме, скорее всего, нет. Но эта функция была добавлена вместе с остальными функциями Linq и относится к тому же семейству функций, так что sortof:)