reactjs - 为什么我的父组件没有重新渲染?

标签 reactjs redux react-redux

我有一个父组件,它呈现子组件列表。该列表取自 redux 存储。

在每个子组件中,我都有一个删除按钮,用于从 redux 存储中删除该特定项目,从而也删除该子组件。

我的子组件可以很好地从商店中删除该项目,那么为什么我的父组件没有重新渲染以将该子组件从列表中删除?

我尝试在父组件中设置“刷新”本地状态,并尝试在子组件中切换该状态,但由于某种原因不起作用。

这是我的父组件:

class TodaysClasses extends Component {

  componentDidMount() {
    this.props.fetchTodayClasses('Tuesday')
  }

  renderClasses = (classes) => {
    if (classes.length > 0) {
      return classes.map((classRoom) => {
        return (
          <ClassComp classId={classRoom.id} key={classRoom.id}
            deleteClass={this.props.deleteClass}
          />
        )
      })
    } else {
      return <div>There are no classes for today.</div>
    }
  }

  render() {
    return (
      <div>
        <h3>Todays Classes</h3>
        <div className="ui divider"></div>
        <div className="ui grid container">
          <div className="row">
            {this.renderClasses(this.props.classes)}
          </div>
          <div className="row">
            <Link to="/newclass" className="ui labeled primary icon button">
              <i className="plus icon" />
              Add Class
            </Link>
          </div>
        </div>
      </div>
    )
  }
}

const mapStateToProps = state => {
  // turn the classes object to an array for easier iterations
  return { classes: Object.values(state.classes) }
}

export default connect(mapStateToProps, { fetchTodayClasses, deleteClass })(TodaysClasses)

这是我的子组件:

const ClassComp = (props) => {
  const { teacher, subject, students, id } = props.classOf

  return (
    <div className="ui segment" >
      <div className="content">
        <div className="ui medium header">{teacher} - {subject}</div>
        <div className="ui divider"></div>
        <div className="ui sub header">Students</div>
        <div>{renderStudents(students)}</div>
        <div style={{ marginBottom: '30px' }}>
          <button className="mini compact ui negative right floated button"
            onClick={() => props.deleteClass(id)}>Delete Class
          </button>
          <button className="mini compact ui right floated button">Edit Class</button>
        </div>

      </div>
    </div >
  )
}


const renderStudents = (students) => {
  if (students && students.length > 0) {
    return (
      <ol>
        {students.map((student, index) =>
          <li key={index}>{student}</li>
        )}
      </ol>
    )
  } else {
    return <p style={{ margin: '10px' }} >No students registered.</p>
  }
}

const mapStateToProps = (state, ownProps) => {
  return { classOf: state.classes[ownProps.classId] }
}

export default connect(mapStateToProps)(ClassComp)

这是我的 Action 创建者:

export const fetchTodayClasses = day => async dispatch => {
  const response = await classes.get(`/classes?day=${day}`)

  dispatch({ type: 'FETCH_TODAYCLASSES', payload: response.data })
}

export const deleteClass = id => async dispatch => {
  await classes.delete(`/classes/${id}`)

  dispatch({ type: 'DELETE_CLASS', payload: id })
}

这是我的 reducer :

export default (state = {}, action) => {
  switch (action.type) {    
    case 'DELETE-CLASS':
      return _.omit(state, action.payload)
    case 'FETCH_TODAYCLASSES':
      return { ...state, ..._.mapKeys(action.payload, 'id') }    
    default:
      return state
  }
}

最佳答案

删除项目时您错过了一个步骤:

  1. 已调度 DELETE-CLASS 类型的操作
  2. 该项目被reducer删除
  3. 缺少步骤 - 使用新数据更新商店

您可以通过 2 种常见模式来实现:

  1. 通过 API 调用获取新数组
    componentDidUpdated() {
        this.props.actions.fetchTodayClasses(DAY);
    }
    
  2. 更新reducer内的数组( redux mutation patterns )
     case 'DELETE-CLASS':
       let updatedClasses = _.omit(state, action.payload);
       return { ...state, ..._.mapKeys(updatedClasses, 'id') }
    
    我认为这两个选项是react-redux 中最常见的模式。你查一下这个SandBox观看演示。确保您在状态结构中正确使用它。

关于reactjs - 为什么我的父组件没有重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55769183/

相关文章:

javascript - React + Redux,如何不在每次调度后渲染,而是在多次调度后渲染?

javascript - React redux 组件未在商店更改时更新?

reactjs - 在 React Hooks useEffect 清理失败中取消 Axios REST 调用

javascript - MERN:类型错误:未定义不是对象(评估 'this.props.params.id' )

javascript - Redux:两个组件加载相同的资源,仅在一个组件中显示加载器

javascript - 在 React 中创建更多元素

javascript - 根据 Redux 状态更改组件的布局

reactjs - 如何在 redux 连接的受控组件中使用先前状态加上附加值来调用 setState?

reactjs - 如何将操作列设置为 Material ui 表 ReactJs 中的最后一列?

javascript - ES6 '...' 符号在 jslint 中给出错误?