2017-02-15 6 views
1

У меня есть ребенок компонент таблицу, которая должна быть оказана каждый раз, когда его состояние меняется, но и, иногда, когда новые реквизита прибывают из родителей;ReactJS компоненты использовать реквизит или состояние, чтобы сделать

Таблица Компонент должен быть повторно использован и обрабатывает собственное состояние. Когда меняется его ширина, я использую setState (newTableWidth) для повторной обработки таблицы (пока это так хорошо).

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

Проблема: После изменений в родительском приложении (или в различных суб-компонентов), я хочу, чтобы обновить props.tableWidth и повторно вынести таблицу. Но есть и другие сценарии, в которых Проект оказывает Таблица без обновления реквизита.tableWidth.

Как можно Таблица Знать, когда нужно сделать рендеринг, используя опоры и когда делать себя с использованием состояния?

Пример кода:

class Table extends React.Component { 
    constructor(props) { 
     this.state = { 
      tableWidth: this.props.tableWidth 
      columnOrder 
     }; 
    } 
    onWidthChange(newWidth){ 
    this.setState({tableWidth:newWidth}) 
    } 

} 

class Project extends React.Component { 
render(){ 
    if (this.onChangeTableWidth()){ 
     let width = this.calculateTableWidth(); 
    } 
    <Table tableWidth = {width}/> 
} 
} 

ответ

0

React будет автоматически повторно визуализироваться при реквизита или изменения состояния, так что вам не придется беспокоиться об этом. Вы можете использовать метод жизненного цикла componentWillReceiveProps(nextProps) для обновления вашего состояния с новой шириной, полученной через реквизиты, для этого используйте setState(...).

+0

но что делать, если нет никаких изменений в реквизитах, но я хочу _Table_ использовать реквизиты вместо состояния? , например: оказываю _Table_ с реквизитом: tableWidth = 100 Теперь _Table_ изменил свое состояние на tableWidth = 200 и теперь _Project_ компонент вызвал onChangeTableWidth() и необходимость повторной визуализации _Table_ снова tableWidth = 100 в этом случае реквизита не изменилось, поэтому моя таблицаWidth будет равна 200, а не 100 –

+1

Я бы сказал, пусть только компонент контейнера (родителя) будет отвечать за изменение таблицыWidth, например, передать функцию через реквизиты, которая будет действовать как 'onChangeTableWidth (width)' обработчик и удерживать ширину в контейнере или, по крайней мере, всегда пропускать ширину, полученную с помощью параметров функции. Таким образом, существует только один источник истины, который является компонентом контейнера, и никогда не возникает путаницы, каким образом была установлена ​​ширина, поскольку она все еще обновляется одинаково. Однако, как уже упоминалось, вы также можете использовать некоторый механизм управления государством, я рекомендую вам взглянуть на сокращение или mobx. –

1

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

Смежные вопросы