#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть две страницы (страница 1 и страница 2) с SimpleTable
компонентом.
У меня есть страница с таблицей для яблок:
render() {
const props = this.props
return (
<Page {...props}>
<SampleTable requestData={this.getApples} columns={[<columns for apples>]} />
</Page>
)
}
И страница с таблицей для tomatoes:
render() {
const props = this.props
return (
<Page {...props}>
<SampleTable requestData={this.getTomatoes} columns={[<columns for tomatoes>]} />
</Page>
)
}
По неизвестным мне причинам этот конкретный дочерний элемент ( SampleTable
) не размонтируется / монтируется при переходе со страницы 1 на страницу 2 или наоборот.
Это странно, поскольку все остальные дочерние элементы на всех других страницах монтируются / размонтируются, даже когда я использую один и тот же компонент для дочерних элементов. Итак, очевидно, что я не понимаю, как / когда React решает смонтировать / размонтировать или когда он решает повторно использовать компонент. Но я отвлекся.
Я приму этот факт: React будет повторно использовать дочерние элементы, когда ему заблагорассудится.
Моя проблема в том, что я использую Sampletable.componentDidMount
для запроса данных:
componentDidMount() {
console.log('SampleTable did mount. Requesting data ...')
this.props.requestData(state.pageSize, state.page, state.sorted, state.filtered).then(res => {
this.setState({
data: res.rows,
pages: res.pages,
loading: false,
})
})
}
Но функция запроса данных предоставляется родительским, через props
. У меня следующая проблема:
- при первоначальном рендеринге страница 1 предоставляет
requestData=getApples
viaprops
дляSampleTable
дочернего элемента. SampleTable
монтирует и запрашивает данные, используяgetApples
метод, предоставленныйpage1
- Я перехожу к
page2
page2
предоставляет другойrequestData=getTomatoes
метод дляSampleTable
дочернего элемента- каким-то образом Reacts решает, что он может повторно использовать исходный компонент для этого дочернего элемента и, поскольку он уже смонтирован,
componentDidMount
не вызывается - и поэтому новый
getTomatoes
метод не вызывается, и никакие данные, подходящие для таблицы tomatoes, не запрашиваются.
Что я делаю не так?
Как я могу гарантировать, что изменение в props
запускает перезагрузку данных?
Комментарии:
1. Ваш вопрос мне не очень понятен. Когда вы говорите «страница 1» и «страница 2», вы говорите о двух разных компонентах React или о его подобной разбивке на страницы, где компонент одинаков, вы изменяете данные внутри компонента страницы?
2. @ArpitAgrawal использует два разных компонента, используя
Page
компонент3. можете ли вы проверить, вызывается ли
componentWillUnmount
при переходе от 1 компонента к другому компоненту, поскольку вы визуализируете два разных компонента?4. @ArpitAgrawal Я не уверен, что ты имеешь в виду. В моей первоначальной настройке (без
key=
) дочерний компонент был смонтирован один раз и больше не размонтировался. Переход отpage1
кpage2
(оба с дочерним элементом на основе одного и того жеSimpleTable
компонента) позволил react повторно использовать дочерний элемент.5. Давайте не будем называть их Page1 и Page2, потому что это сбивает с толку разбивку на страницы или компонент страницы. Поскольку это два разных компонента, давайте назовем их Component 1 и Component 2. Теперь, насколько я понимаю, react гласит, что при переходе с C1 на C2 C1 должен размонтировать, если они разные. если C1 и C2 на самом деле одинаковы, и вы передаете только разные реквизиты, то компонент не будет размонтирован, вместо этого
componentWillRecieveProps
вызывается метод. Было бы полезно, если бы вы могли поделиться некоторым codesnippet.
Ответ №1:
Вам следует попробовать использовать уникальный атрибут key в вашем компоненте SampleData при его вызове, чтобы react узнал, что это другой экземпляр вашего компонента, и соответствующим образом перерисовал его.
Вы можете найти больше о ключах здесь:https://reactjs.org/docs/lists-and-keys.html
Комментарии:
1. Я думаю, что это предназначено для случаев, когда вы отображаете список одинаковых компонентов. Я не вижу здесь случая (здесь нет списка). Это могло бы решить проблему, но, конечно, не лучшим способом, я думаю.
2. Я действительно хотел бы знать, как лучше решить проблему такого рода. Как бы вы это решили?
3. давайте сначала выясним, в чем собственно проблема. Поскольку у него есть два разных компонента, и переход от 1 компонента к другому компоненту должен вызывать componentWillUnmount , поэтому я не думаю, что это случай обновления dom, оптимизирующего react. Но давайте дождемся ответа OP.
4. Я не уверен, что это лучший способ решить проблему, но этот подход решает ее для меня. Затем компонент размонтируется / монтируется, что запускает перезагрузку данных.
5. Это странно, потому что компоненты являются дочерними элементами разных родителей. Они должны быть разными экземплярами, но каким-то образом react решает повторно использовать дочерний элемент одного родителя для другого родителя, если не предоставлен ключ. Понятия не имею, что происходит, но использование
key=
при объявлении дочернего компонента в родительском решает проблему.