React:nextProps和state总是一样的;因此组件不会重新渲染

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React:nextProps和state总是一样的;因此组件不会重新渲染相关的知识,希望对你有一定的参考价值。

我陷入了一种奇怪的境地。

我有一个用于两者的组件,也提供信息和编辑该信息。由于这种情况,我必须在组件的状态中保留此信息的副本(信息通过props传递给组件,我使用的是Redux)。

但是,情况是如果我尝试更新某些内容,我的组件不会重新呈现。原因是我的nextProps和当前状态总是一样的。

我没有直接改变我的状态,这里是我的组件和容器。我添加了componentShouldUpdate以检查它是否正确处理状态更新。我记录了nextProps和州,这两个总是一样的。

零件

export class SingleSpacePartner extends Component  {
  state = {
    spacePartner: {}
  }

  componentDidMount(){
    this.getSpacePartner();
  }

  shouldComponentUpdate(nextProps, state) {
    console.log(nextProps, state);
    return true;
  }

  toggleAccount = (value)=> {
    const spacePartner = {...this.state.spacePartner, active: value};
    this.setState({spacePartner});
  }

  handleChange = (e)=> {
    const { name, value } = e.target;
    const spacePartner = {...this.state.spacePartner, [name]: value};
    console.log(spacePartner);
    this.setState({spacePartner});
  }

  getSpacePartner = ()=>{
    let id = this.props.match.params.id;
    const handleSuccess = ({data})=>{
      return this.props.getSingleSpacePartnerSuccess(data);
    };
    return this.props.getSingleSpacePartner(id).payload.then(handleSuccess).catch(err => err);
  }

  updateSpacePartner = (e)=> {
    e.preventDefault();
    const {spacePartner} = this.state;

    spacePartner.centers = spacePartner.centers.map(el => el._id);

    this.props.updateSpacePartner(spacePartner._id, spacePartner).payload.then(this.getSpacePartner).catch(err => err);
  }

  render() {
    let { spacePartner } = this.state;
    let { loading } = this.props;
    return (
      <div className='single_space_partner_page'>
        <SidebarContainer activeRoute='spacePartner'/>
        {Object.keys(spacePartner).length ?
            <div className='single_space_partner_wrapper'>
              <EditSpacePartner value={spacePartner} toggleAccount={this.toggleAccount} updateSpacePartner={this.updateSpacePartner} handleChange={this.handleChange}/>

              // rest of the template

            </div>
            : null}
      </div>
    )
  }
}

容器

const mapDispatchToProps = dispatch => ({
  // actions
});

const mapStateToProps = ({ spacePartner: spacePartnerState }) => {
  let {spacePartner, loading, error} = spacePartnerState;

  return {
    spacePartner,
    loading,
    error
  };
};


export const SingleSpacePartnerContainer = connect(mapStateToProps, mapDispatchToProps)(SingleSpacePartner);

另一件奇怪的事就是说我的太空伙伴有一个头衔。当前值是My Title,如果我从中删除e,那么传播的更改是{title: 'My Titl'},当然视图不会重新渲染。但是,如果我也删除l,那么传播的变化仍然是{title: 'My Titl'}

这可能是什么原因?

谢谢。

编辑:这是我的EditSpacePartner组件

import React from 'react';
import {Toggle} from '../common/Toggle/Toggle';

export const EditSpacePartner = ({value, toggleAccount, updateSpacePartner, handleChange}) => {
  return (
    <div className='edit_space_partner'>
      <h2>Space Partner</h2>
      <form onSubmit={updateSpacePartner}>
        <div className='form_wrapper'>
          <div className='edit_name_wrapper'>
            <label htmlFor=''>Name</label>
            <input type='text' name='name' value={value.name} onChange={handleChange}/>
          </div>
          <div className='edit_product_key_wrapper'>
            <label>Status</label>
            <Toggle value={value.active} toggle={toggleAccount}/>
          </div>
          <div className='edit_name_wrapper'>
            <label htmlFor=''>Sample</label>
            <input type='text' readOnly name='name' value={value.sample || false}/>
          </div>
          <input type='submit' className='submit'/>
        </div>
      </form>
    </div>
  );
};
答案

我想如果你删除下面的代码,那么它将解决你的问题。

shouldComponentUpdate(nextProps, state) {
    console.log(nextProps, state);
    return true;
  }
另一答案

spacePartner是一个对象,你正在改变它。如果你改变它就不会有任何比较。使用Object.assign()更改对象的任何值。不变性有助于比较props / nextProps和state / nextState。

以上是关于React:nextProps和state总是一样的;因此组件不会重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

[react] React中如何监听state的变化?

React学习笔记基础

React学习笔记基础

react webapp 开发小结

react 性能优化之 componentWillReceiveProps & componentDidUpdate

react 性能优化之 componentWillReceiveProps & componentDidUpdate