Не удается обновить компонент на реквизит или изменение состояния - PullRequest
0 голосов
/ 30 января 2019

Я хочу, чтобы браузер показывал EditMessage компонент (в Dashboard.js), если showEdit истинно (см. initState в MessageReducer.js), и CreateMessage компонент, если showEdit ложно, но мой код не 'т работа.Мое приложение не замечает состояние или изменение реквизита в Dashboard.js.

Я попытался включить метод this.setState в Dashboard.js, но получаю сообщение об ошибке: «Превышена максимальная глубина обновления. Это может происходить, когда компонент повторно вызывает setState внутри componentWillUpdate или componentDidUpdate».Я также пытался присвоить значение showTypeForm напрямую реквизиту и вывести его (см. Комментарии в Dashboard.js), но этот подход тоже не сработал.Я не уверен, какой метод жизненного цикла использовать.

Мой код выглядит следующим образом.MessageSummary.js:

 import React, { Component } from 'react';
 import { connect } from 'react-redux';
 class MessageSummary extends Component {
    editClick = (e) => {
       e.preventDefault();
       this.props.editMessage('123', 'I love web development'); //test values
    }
    render() {
       return (
          <button className="edit-message" onClick={this.editClick}>Edit 
          Message</button> // this button changes showEdit in MessageReducer.js
       )
    }
 }
 const mapDispatchToProps = (dispatch) => {
    return {
       editMessage: (id, newMessage) => dispatch(editMessage(id, newMessage))
    }
 }
 export default connect(null, mapDispatchToProps)(MessageSummary); 

MessageActions.js:

export const editMessage = (id, newMessage) => {
  return (dispatch, getState, { getFirebase, getFirestore }) => {
    dispatch({
      type: "EDIT_MESSAGE"
    });
  }
}

RootReducer.js:

// importing everything
const rootReducer = combineReducers({
  message: messageReducer
});
export default rootReducer;

MessageReducer.js:

const initState = {
  showEdit: false
};
const messageReducer = (state = initState, action) => {
  switch (action.type) {
     case 'EDIT_MESSAGE':
         initState.showEdit = !initState.showEdit; // toggling showEdit
         return state;
     default:
        return state;
     }
  }
 export default messageReducer;

Dashboard.js:

// importing everything
class Dashboard extends Component {
   state = {
      showEdit: this.props.message.showEdit
   }

   render() {
      const { message } = this.props; // destructuring

      // this.setState({
        //  showEdit: message.showEdit
      // })

      // const showTypeForm = message.showEdit ? <EditMessage /> : <CreateMessage />;

      return (
        <div className="message-form">   
            {this.state.showEdit ? <EditMessage /> : <CreateMessage />}
            // {showTypeForm }
        </div>   
      )
    }
   const mapStateToProps = (state) => {
      return {
         message: state.message
      }
   }
 }
 export default connect(mapStateToProps)(Dashboard); 

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Что-то не так в вашем редукторе 'MessageReducer.js'.Здесь вы непосредственно изменяете значение initState, которое противоречит спецификациям функции редуктора.Он должен быть чистой функцией и не должен изменять состояние, каждый раз возвращая новый объект состояния.
Пожалуйста, попробуйте ниже обновленный код в MessageReducer.js

const initState = {
  showEdit: false
};
const messageReducer = (state = initState, action) => {
  switch (action.type) {
     case 'EDIT_MESSAGE':
         let updatedState = Object.assign({},state,{showEdit:!state.showEdit}) ;
         return updatedState;
     default:
        return state;`enter code here`
     }
  }
 export default messageReducer;
0 голосов
/ 30 января 2019

Вы не обновляете состояние при изменении реквизита, вам нужно сделать это в componentDidUpdate с условием, чтобы оно не зависало в бесконечном цикле («Превышена максимальная глубина обновления). Надеюсь, это поможет.

Запись this.setState внутри render сделает вас застрявшим в бесконечном цикле, потому что каждый раз при изменении состояния компонент рендерится снова.

class Dashboard extends Component {
   state = {
      showEdit: this.props.message.showEdit
   }
   componentDidUpdate(prevProps){
   if(this.props.message !== prevProps.message){
       this.setState({
        showEdit: this.props.message.showEdit
       })
     }
   }
   render() {
      const { message } = this.props; // destructuring

      // this.setState({
        //  showEdit: message.showEdit
      // })

      // const showTypeForm = message.showEdit ? <EditMessage /> : <CreateMessage />;

      return (
        <div className="message-form">   
            {this.state.showEdit ? <EditMessage /> : <CreateMessage />}
            // {showTypeForm }
        </div>   
      )
    }
   const mapStateToProps = (state) => {
      return {
         message: state.message
      }
   }
 }
 export default connect(mapStateToProps)(Dashboard);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...