Список. ForEach технически часть LINQ или нет?

Ну да, конечно, нажимая на кнопки журналов []. В этом:

<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>

10
задан Joel Coehoorn 17 April 2009 в 15:28
поделиться

6 ответов

Он не является частью LINQ - он существовал в .NET 2.0 задолго до LINQ. Он похож на LINQ, но я бы не сказал, что он является частью LINQ.

С другой стороны, если вы реализуете свой собственный метод расширения IEnumerable ForEach (например, в MoreLINQ), что можно рассматривать как нестандартный оператор LINQ ...

12
ответ дан 3 December 2019 в 22:01
поделиться

Linq означает «языковой интегрированный запрос». Чтобы действительно «использовать» linq, вам нужна конструкция, похожая на эту: гарантировать свое собственное модное слово. Сказать, что вы можете использовать лямбда-выражения, на самом деле это не так. Например, этот образец. Вы могли бы использовать linq, но почему, когда это так же хорошо и намного короче:

var result = words.Where(w => w.Length < 5);
2
ответ дан 3 December 2019 в 22:01
поделиться

ForEach - это не LINQ, это просто метод, который принимает делегата. Начиная с версии .NET 2.0.

3
ответ дан 3 December 2019 в 22:01
поделиться

Принятие делегата не делает его LINQ.

Foreach - это не метод LINQ, это не член Enumerable или Queryable , и для него нет синтаксиса понимания.

И, самое главное, он изменяет источник (список), который не является чем-то LINQ объектам.

Я бы сказал «Нет».

1
ответ дан 3 December 2019 в 22:01
поделиться

В приведенном вами примере вы не используете LINQ. Метод ForEach - это просто хороший способ перебирать элементы вашего перечислимого типа данных без явной записи цикла.

0
ответ дан 3 December 2019 в 22:01
поделиться

Если вы пытаетесь оправдать LINQ в качестве ключевого слова резюме, скорее всего, нет. Но эта функция была добавлена ​​вместе с остальными функциями Linq и относится к тому же семейству функций, так что sortof:)

-2
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: