#javascript #reactjs #components #react-props #conditional-rendering
#javascript #reactjs #Компоненты #react-props #условный рендеринг
Вопрос:
Мне было интересно, есть ли способ отправить условие в качестве prop дочернему компоненту, которому требуется некоторый условный рендеринг и итерация набора динамических объектов.
Допустим, я хочу, чтобы один из этих объектов был отображен условно, поэтому a сделайте что-то вроде этого:
const Content = [{
object: "One",
value: one,
name: "object1"
}, {
object: "Two",
value: two,
name: "object2",
condition: object1.value === "One"
}]
Итак, в зависимости от значения первого объекта, который может быть, скажем, тегом select, я хочу, чтобы отображался второй.
Тогда у нас есть наш объект:
Затем внутри компонента я буду выполнять итерацию объекта и условно отображать входные данные или выборки.
Есть идеи? Заранее спасибо.
Редактировать:
Это компонент
function FormCase ({ onSubmit, register, content }) {
return (
<Form id="form" onSubmit={onSubmit}>
<Row className="form-row">
{content.map((obj, idx) => {
return (
obj.conditional amp;amp;
<div className="form-group" key={idx}>
<label>{obj.name}</label>
<input className="form-control" value={obj.value} />
</div>
)
})}
</Row>
<Row className="submit-row">
<input type="submit" value="Create" />
</Row>
</Form>
)
}
Комментарии:
1. Не могли бы вы предоставить более подробную информацию о вашем коде? Сейчас этот вопрос не так ясен.
2. Не могли бы вы также добавить код?
3. Я добавил туда некоторый код.
4. Глядя на ваш код, вы уже добились условного отображения. просто измените obj.conditional на obj.condition. Если условие будет истинным, произойдет рендеринг. Кстати — никогда не используйте индекс в качестве ключа, используйте уникальное значение для каждого дочернего элемента.
Ответ №1:
const content = [{
object: "One",
value: one,
name: "object1"
}, {
object: "Two",
value: two,
name: "object2",
condition: value => value === "One"
}]
// while rendering
const toRender = content.filter(item => !item.condition || item.condition("some value"));
// or filter function of your choice
затем просто отобразите отфильтрованные элементы.
Редактировать:
function FormCase ({ onSubmit, register, content }) {
return (
<Form id="form" onSubmit={onSubmit}>
<Row className="form-row">
{content.map((obj, idx) => {
if (idx > 0) { // don't check the condition for first
return (
obj.condition amp;amp; obj.condition(content[idx-1].value) amp;amp;
<div className="form-group" key={idx}>
<label>{obj.name}</label>
<input className="form-control" value={obj.value} />
</div>
)
} else {
return (
<div className="form-group" key={idx}>
<label>{obj.name}</label>
<input className="form-control" value={obj.value} />
</div>
)
}
})}
</Row>
<Row className="submit-row">
<input type="submit" value="Create" />
</Row>
</Form>
)
}
Итак, вы просто передаете функцию как condition
в вашем content
массиве. Во время рендеринга вы должны проверить condition
значение предыдущего элемента в качестве параметра для вашей функции.
Вы должны настроить логику — что делать, когда в вашем condition
объекте не определена content
функция.
Комментарии:
1. Для меня это не очень понятно. Должен ли я отправлять переменную «toRender» в качестве условия?
2. Я отредактировал ответ, используя код, который вы добавили к вопросу