React - альтернатива componentWillReceiveProps

Я использую React с NextJS.

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

Приведенный ниже код отлично работает.

class Summary extends Component{

    state = {
        total: 0,
        pass: 0,
        fail: 0,
        passp: 0,
        failp: 0
    }

    componentWillReceiveProps(props){
        let total = props.results.length;
        let pass  = props.results.filter(r => r.status == 'pass').length;
        let fail  = total - pass;
        let passp = (pass/(total || 1) *100).toFixed(2);
        let failp = (fail/(total || 1) *100).toFixed(2);
        this.setState({total, pass, fail, passp, failp});
    }

    render() {
        return(
          <Table color = "teal" >
                <Table.Header>
                  <Table.Row textAlign = "center">
                    <Table.HeaderCell>TOTAL</Table.HeaderCell>
                    <Table.HeaderCell>PASS</Table.HeaderCell>
                    <Table.HeaderCell>FAIL</Table.HeaderCell>
                    <Table.HeaderCell>PASS %</Table.HeaderCell>
                    <Table.HeaderCell>FAIL %</Table.HeaderCell>                                 
                  </Table.Row>
                </Table.Header>
                <Table.Body>
                  <Table.Row textAlign = "center">
                    <Table.Cell>{this.state.total}</Table.Cell>
                    <Table.Cell >{this.state.pass}</Table.Cell>
                    <Table.Cell >{this.state.fail}</Table.Cell>                                     
                    <Table.Cell >{this.state.passp}</Table.Cell>
                    <Table.Cell >{this.state.failp}</Table.Cell>                                      
                  </Table.Row>
                </Table.Body>
           </Table>             
        );
    }
}

Похоже, что componentWillReceiveProps больше не поддерживается. Я пробовал другие варианты, такие как shouldComponentUpdate и т. д., Все они приводят к бесконечному циклу. Как лучше всего обновить состояние из реквизита для повторного рендеринга этого компонента?

componentWillReceiveProps будет устаревшим? Вы используете React17? В приведенном выше скрипте нет кода, который вызывает бесконечный цикл

RIYAJ KHAN 05.06.2018 06:43
reactjs.org/docs/…
Denis Tsoi 05.06.2018 06:43

@RIYAJKHAN, как я уже сказал, он устарел. Также этот компонент работает нормально. Ищу альтернативу

KitKarson 05.06.2018 06:47

@DenisTsoi getDerivedStateFromProps является статическим. я не могу вызвать setState

KitKarson 05.06.2018 06:47

вы можете просмотреть ответ ниже, чтобы узнать, как установить состояние с помощью getDerivedState -

Denis Tsoi 05.06.2018 06:48
reactjs.org/blog/2018/03/27/…
Denis Tsoi 05.06.2018 06:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
34
6
38 279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из реакции блог, 16.3 представила уведомления об устаревании для componentWillRecieveProps.

В качестве обходного пути вы можете использовать метод

static getDerivedStateFromProps(nextProps, prevState)

следовательно

componentWillReceiveProps(props){
    let total = props.results.length;
    let pass  = props.results.filter(r => r.status == 'pass').length;
    let fail  = total - pass;
    let passp = (pass/(total || 1) *100).toFixed(2);
    let failp = (fail/(total || 1) *100).toFixed(2);
    this.setState({total, pass, fail, passp, failp});
}

становится

static getDerivedStateFromProps(nextProps, prevState) {
  if (nextProps.total !== prevState.total) {
    return ({ total: nextProps.total }) // <- this is setState equivalent
  }
  return null
}

Рекомендация от React - использовать componentDidUpdate вместо getDerivedStateFromProps, если вам нужно выполнить побочный эффект (например, выборку данных или анимацию) в ответ на изменение свойств. reactjs.org/docs/…, reactjs.org/blog/2018/03/27/…

user1912383 19.09.2018 10:27

@ user1912383 Нет необходимости использовать componentDidUpdate, это зависит от конкретного случая, реагируйте также рекомендую альтернативу getDerivedStateFromProps: reactjs.org/blog/2018/06/07/…

Yogesh Devgun 21.02.2020 15:22

и добавьте: else return null

merry_ejik 04.05.2020 12:16

Да, если забыть об остальном, это вызовет некоторые ошибки

Kingalione 14.05.2020 18:30

как установить состояние внутри метода getDerivedStateFromProps, если он асинхронный

Vinod Kumar 16.12.2020 15:53

Другие вопросы по теме