мы увидим, как использовать getDerivedStateFromProps в React для обновления свойств и состояния компонента.
Обновление
Обновление — это процесс изменения состояния или реквизитов компонентов и обновления изменений узлов, уже находящихся в DOM. Обновление может быть вызвано изменениями реквизитов или состояния. Эти методы вызываются в следующем порядке при повторном рендеринге компонента:
А.) статический getDerivedStateFromProps
Это вызывается непосредственно перед вызовом метода рендеринга, как при первоначальном монтировании, так и при последующих обновлениях. IT должен вернуть объект, чтобы обновить состояние, или null, чтобы ничего не обновлять. Этот метод существует для редких случаев использования, когда состояние зависит от изменений реквизитов с течением времени. Этот метод не имеет доступа к экземпляру компонента. Поскольку это статический метод, это ключевое слово недоступно внутри этого метода.
создать новый проект
$ create-react-app day-12 $ cd day-12 $ npm start
Добавьте Student.js и Marks.js в папку src. Marks.js будет дочерним компонентом Student.js.
добавьте следующий код в Student.js
import React, {Component} from 'react'; import Marks from './Marks'; export default class Student extends Component { constructor(){ super(); //we are passing this state to our child (Marks) as props. this.state = { roll: 101 }; } clickHandle = () =>{ console.log('button clicked') this.setState({roll:102}) }; render() { console.log("student component rendered") //the state above defined will passed as prop atttribute //of Mark component return ( <div> <Marks roll={this.state.roll} /> <button onClick={this.clickHandle} >Change</button> </div> )}}
Марк.js
import React, {Component} from 'react'; export default class Marks extends Component { constructor(props) { super(props); this.state = { mroll: this.props.roll }} static getDerivedStateFromProps(props, state) { console.log("Get Derived Ran") console.log(props.roll) console.log(state.mroll) console.log(props, state) if(props.roll !== state.mroll){ return {mroll: props.roll} } return null } render() { console.log("marks component rendered") return ( <div> <h1>{this.state.mroll}</h1> </div> )}}
и так, что здесь происходит?
В нашем файле Student.js у нас есть список свойств в качестве состояния. Это означает, что мы можем изменить значение броска, используя setState.
помните, мы не можем сделать вот так:
this.state.roll = 102 ❌ this.setState({roll:102}) ✅
состояние будет обновлено нажатием кнопки. Итак, мы разместили обработчик события clickHandle().
И в методе рендеринга мы передаем нашу опору (this.state.roll) дочернему компоненту (Marks.js).
У Student.js есть только один вывод в консоли, «рендеринг компонента студента», прежде чем мы нажмем нашу кнопку.
Теперь давайте посмотрим, что происходит в Marks.js.
мы передали свойства Student конструктору Marks и сохранили их в свойстве mroll.
теперь мы поместили метод getDerivedStateFromProps перед нашим методом рендеринга. Мы разместили нашу логику внутри этого метода
if(props.roll !== state.mroll) { return {mroll: props.roll} }
реквизит, поступающий от Student, сравнивается с нашим текущим состоянием компонента Marks.
теперь, прежде чем мы нажмем кнопку,
props.roll = state.mroll
после того, как мы нажали кнопку, состояние Student (roll) изменило свое значение на 102
now, props.roll != state.mroll
и в методе рендеринга мы записываем console.log («отмечает визуализированный компонент»).
Это должно быть все для метода getDerivedStateFromProps(). На следующем уроке мы увидим метод shouldComponentUpdate().
Фото автора Pakata Goh на Unsplash