Как ввести реакцию.Дети.карта с дополнительными реквизитами, которые не доступны потребителю компонента?

#reactjs #typescript

#реагирует на #машинописный текст

Вопрос:

(Для простоты я бросил несколько любых здесь и там)

Со стороны потребителя я получил —

 const Foo: React.FunctionComponentlt;{  items: Arraylt;{ id: string; title: string; caption: string }gt;; }gt; = ({ items }) =gt; {  const [value, setValue] = React.useStatelt;number | nullgt;(null);  const handleChange = (_: React.SyntheticEvent, newValue: number | null) =gt; {  setValue(newValue);  };   return (  lt;Wrapper value={value} handleChange={handleChange}gt;  {items.map(({ id, title, caption }) =gt; {  return lt;Inner key={id} title={title} caption={caption} /gt;;  })}  lt;/Wrappergt;  ); };  

Что делает Обертка, так это берет детей и передает им несколько дополнительных реквизитов, вот так —

 const Wrapper: React.FunctionComponentlt;{  value: number | null;  handleChange: any; }gt; = ({ value, handleChange, children }) =gt; {  return React.Children.map(children, (child, index) =gt; {  if (!child || !React.isValidElement(child)) {  return null;  }  return React.cloneElement(child, {  onChange: handleChange(index),  value,  selected: value === index,  ...child.props,  });  }); };  

И, в конце концов, Внутреннее-это —

 const Inner: React.FunctionComponentlt;{  title: string;  caption: string;  onChange: any;  value: number | null;  selected: boolean; }gt; = ({ title, caption, onChange, value, selected }) =gt; {  return (  lt;ThirdPartyComponent onChange={onChange} value={value} selected={selected}gt;  lt;h1gt;{title}lt;/h1gt;  lt;h5gt;{caption}lt;/h5gt;  lt;/ThirdPartyComponentgt;  ); };  

Проблема в том, что интерфейс Inner требует вещей, которые не передаются в Foo, но передаются в оболочке. Я пытаюсь найти способ напечатать его таким образом, чтобы не показывать эти реквизиты потребителю. Установка этих реквизитов как необязательных-это решение, которое мне не нравится, потому что оно предоставляет их потребителю. До сих пор я не мог найти решение.

Ответ №1:

Передача реквизитов не является явной, отсюда и проблема. Если Wrapper используется только для этой логики, я бы переписал ее в крюк и вернул недостающие реквизиты:

 const wrapperProps = useWrapper(value, handleChange) return (  lt;gt;  {items.map(({ id, title, caption }, index) =gt; {  return lt;Inner key={id} title={title} caption={caption} {...wrapperProps(index)} /gt;;  })}  lt;/gt; );   

Комментарии:

1. Спасибо за ваш ответ и идею, но я пытаюсь сохранить структуру как есть и найти способ правильно ее напечатать.

2. Если это так, вы можете просто передать эти элементы в компонент-оболочку через prop и запустить карту. Кроме этого, я не вижу другого выхода.

3. Компонент Foo не знает, что происходит с детьми в компоненте-оболочке, поэтому я не думаю, что в этом случае есть какой-либо другой вариант для правильного ввода.