#javascript #reactjs #react-redux #react-hooks
Вопрос:
Я создаю список.но мое условие, если я хочу показать те элементы, которые начинаются с hello
другого, все остальные элементы игнорируются.
не могли бы вы, пожалуйста, сказать мне, как узнать, что такое anchor text
ценность ?
вот мой код
<Tabs>
{data.map((i, idx) => (
<li key={idx}>
<a>{i}</a>
</li>
))}
</Tabs>
мой Tabs.js
import React from "react";
export default function Tabs({ children }) {
const names = () => {
const namesData = [];
React.Children.forEach(children, (child) => {
console.log(child);
// if (child?.textcontent?.indexOf("hello")) {
// namesData.push(child);
// }
namesData.push(child);
});
return {
namesData
};
};
const { namesData = [] } = names();
return <ul>{namesData.map((i) => i)}</ul>;
}
ПРИМЕЧАНИЕ : существует одно решение для первоначальной фильтрации данных при выполнении итерации с использованием карты.но я не хочу использовать это решение
можем ли мы добавить сюда условие, если дочерний тег привязки содержит hello
текст, то только я вставляю массив
React.Children.forEach(children, (child) => {
console.log(child);
// if (child?.textcontent?.indexOf("hello")) {
// namesData.push(child);
// }
namesData.push(child);
});
весь код
https://codesandbox.io/s/compassionate-goldberg-ey2lc?file=/src/tabs.js:0-460
Комментарии:
1. Правильное решение-это то, которое вы не хотите использовать
2. @Ibsn .. Я хочу использовать решение ref
Ответ №1:
Именно так
import React from "react";
export default function Tabs({ children }) {
const names = () => {
const namesData = [];
React.Children.forEach(children, (child) => {
if(child?.props?.children?.props?.children.startsWith('hello')) namesData.push(child);
});
return {
namesData
};
};
const { namesData = [] } = names();
return <ul>{namesData.map((i) => i)}</ul>;
}
Ответ №2:
Поскольку дети являются элементами реакции, у них есть props
, к которым вы можете получить доступ. props
Мощь children
также содержит и так далее. Специально для вашего случая использования это будет работать (песочница):
React.Children.forEach(children, (child) => {
const content = child.props?.children.props?.children;
if(typeof content === 'string' amp;amp; content.startsWith('hello')) {
namesData.push(child);
}
});
Однако я бы так не поступил. Это кажется хрупким и зависит от того, как React решает моделировать детей. Лучшим вариантом было бы отфильтровать исходный массив, чтобы включить только данные для элементов, которые вы хотите отобразить (песочница).:
<Tabs>
{data
.filter(txt => txt.startsWith('hello'))
.map((i, idx) => (
<li key={idx}>
<a>{i}</a>
</li>
))}
</Tabs>
Комментарии:
1. спасибо за ответ, можем ли мы дать
ref
ребенку иref
как мы можем это сделать2. Да, вы можете, но ссылка-это прямая ссылка на фактический элемент DOM, а не на дочерний элемент react, поэтому вам нужно будет использовать инструменты DOM для удаления/скрытия, что в react не очень хорошая идея. Просто отфильтруйте исходный массив.
3. можем ли мы так поступить?..!!
4. можете ли вы обновить свой ответ? я не использовал ref
5. можем ли мы дать ссылку на все дочерние элементы .. затем, используя ссылку, можем ли мы получить значение содержимого ? как давать рекомендации детям ? как получить доступ с помощью ссылки