Как передать данные реквизитов между двумя функциональными компонентами

#reactjs #components

#reactjs #Компоненты

Вопрос:

Я хочу использовать значение реквизита в другом компоненте, но, будучи новичком в react, я не могу этого сделать.

У меня есть эти два функциональных компонента в одном файле

 const actionMarkup = ({ unique_id }) => (
    <React.Fragment>
      <ClientTaskLink taskId={unique_id}>
        <ViewButton />
      </ClientTaskLink>
    </React.Fragment>
  ) 
const ClientTaskIndex = ({tasks, toggleCompleted, showCompleted,clientId}) => {
        return(
            <div className="component">
            <SortTable columns={columns} clientId={clientId} data={tasks} actions={actionMarkup} defaultSort="start_time" defaultDirection="desc" />
            <div className="list-actions">
              <a href="#" onClick={toggleCompleted}>{`${ showCompleted ? 'Hide' : 'View' } Completed Tasks`}</a>
            </div>
            <style jsx>{`
              .list-actions {
                text-align: center;
                margin-top: 30px;
                font-weight: bold;
              }
            `}</style>
          </div>
        ) 
}
    export default ClientTaskIndex;
 

В компоненте ClientTaskIndex есть prop, то есть ClientID, и я хочу использовать это в actionMarkup. Пожалуйста, помогите, это уже потратило впустую много времени. Я пытался использовать напрямую, но это не сработало.

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

1. Что это SortTable за компонент, который вы используете? Что это делает с переданным компонентом actions ?

2. actionmarkup передается этому сортируемому компоненту

3. Я могу передать ClientID этому, но другие компоненты также используют это, и когда я использую его, показанный clientid не является реквизитом в других местах

4. Вы пробовали actions={<ActionMarkup unique_id={id} />} ?

5. @BoyWithSilverWings это показывает, что ActionMarkup не определен

Ответ №1:

У вас есть два варианта справиться с этим:

  1. Использование HOC (компонент высокого порядка): Это своего рода компонент, который будет обертывать как actionMarkup, так и ClientTaskIndex и содержать все реквизиты, разделяемые между этими двумя компонентами. Таким образом, вам будет легко получить необходимый реквизит от HOC. https://reactjs.org/docs/higher-order-components.html
  2. Использование контейнера состояний в качестве Redux: https://redux.js.org /

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

1. Мне нужно решение

Ответ №2:

СПЕЦИАЛЬНАЯ опция:

 const HocComponent = ({ clientId }) => (
 <div>
    <ClientTaskLink clientId={clientId}>
    <ActionMarkup clientId={clientId}>
  </div>
);


const ActionMarkup = ({ unique_id, clientId }) => (
    <React.Fragment>
      <ClientTaskLink taskId={unique_id}>
        <ViewButton />
      </ClientTaskLink>
    </React.Fragment>
  ) 
const ClientTaskIndex = ({tasks, toggleCompleted, showCompleted,clientId}) => {
        return(
            <div className="component">
            <SortTable columns={columns} clientId={clientId} data={tasks} actions={actionMarkup} defaultSort="start_time" defaultDirection="desc" />
            <div className="list-actions">
              <a href="#" onClick={toggleCompleted}>{`${ showCompleted ? 'Hide' : 'View' } Completed Tasks`}</a>
            </div>
            <style jsx>{`
              .list-actions {
                text-align: center;
                margin-top: 30px;
                font-weight: bold;
              }
            `}</style>
          </div>
        ) 
}

export default HocComponent;
 

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

1. повлияет ли это на некоторые функции или теперь ClientID будет доступен

2. какая функциональность?

3. функциональные возможности, которые предоставляет Sortable