【问题标题】:How can I move my child component to new parent in React?如何在 React 中将我的子组件移动到新的父组件?
【发布时间】:2019-09-20 00:30:56
【问题描述】:

我正在渲染一个包含复选框的子组件列表,当单击该复选框时,我想将该子组件移动到另一个 div 元素中。

这是我的应用看起来不错的图片。我想检查学生姓名并将其向上移动,在“现在”子标题下..

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

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

  const handleCheckboxClick = (elId) => {
    const presentStudentEl = document.getElementById('present-students')

    // move StudentCheckbox element inside this element ^
  }

  return (
    <div className="ui segment" style={segmentStyle} >
      <div className="content">
        <div className="ui medium header">{teacher} - {subject}</div>
        <div className="ui divider"></div>
        <div className="ui sub header">Students</div>
        <div className="ui tiny header">Present:
          <div id="present-students"></div>
        </div>
        <div className="ui tiny header">Absent:
          <div id="absent-students">
            {renderStudents(students)}
          </div>
        </div>
        <div style={{ marginBottom: '30px' }}>
          <button className="mini compact ui negative right floated button"
            onClick={() => setModalVisible(true)}>Delete Class
          </button>
          <Link to={`/todaysclass/edit/${props.classId}`} className="mini compact ui right floated button">Edit Class</Link>
        </div>
      </div>
    </div >
  )
}

const mapStateToProps = (state, ownProps) => {
  return { classOf: state.classes[ownProps.classId] }
}
export default connect(mapStateToProps, { deleteClass })(ClassComp)

这是我的子组件:

const StudentCheckbox = (props) => {
  const uniqId = idGenerator()
  return (
    <div className="field" style={{ margin: '5px' }}>
      <div className="ui checkbox">
        <input type="checkbox" id={uniqId} onChange={() => props.handleCheckboxClick(uniqId)} />
        <label htmlFor={uniqId}>{props.student}</label>
      </div>
    </div>
  )
}

【问题讨论】:

    标签: javascript html reactjs


    【解决方案1】:

    在这种情况下,您需要组件的状态。查看文档:

    https://reactjs.org/docs/state-and-lifecycle.html

    所以基本上,除了props(“固定”)之外,你还会有一个state,当你检查项目时它会改变。

    您的render 方法将使用状态将项目放置在一个div 或另一个div 中。所以你所要做的就是使用setState改变状态,渲染方法会重绘新的状态。

    【讨论】:

    • 感谢您的回答!所以我需要的只是父组件中的状态对象吗?但是如何更改渲染子组件的位置?
    • @NewbieDev90 您使用该状态在您的渲染方法中执行一些if 语句。这控制了孩子们将在哪里渲染。
    【解决方案2】:

    您正在使用 redux 来管理状态。那挺好的。它有助于正确管理/操作数据。

    在这种情况下,您尝试在不更改数据的情况下装饰视图 [在 redux 存储中] - 这不好,甚至在 react 中都没有意义。

    渲染的组件/视图只是一个 [派生的] View 从一个 Model(state) - 在 MVC 中。在 DOM 中将某些元素从一个 div 移动到另一个(如果你实现了这个)不会改变 [base] 状态 - 重新渲染后你会失去这些变化。


    更新:

    您应该保持学生在商店中的存在(默认为 false)。 您需要一个单独的操作(使用参数/有效负载:classIdstudentId),调用 API(在操作创建者中以节省出勤率)和 reducer 以更改“标志” ' 在 redux 商店中。

    每个student 都会有isPresent 属性。您可以简单地更改您的 renderStudents 以呈现两个 div(附加的布尔参数和开始时的适当过滤)。

    【讨论】:

    • 感谢您的回答,但我很难理解。我正在尝试做的事情是不是很不正统?是的,我确实考虑过为此编写另一个动作创建器和减速器,但我就是想不通..
    • 从添加(和删除)学生到课堂的操作开始?搬家会很相似。
    • 学生都已经上课了。我的 OP 中显示了两个“类”组件。我想将班级中的每个学生组件从“缺席”移动到 div 标签“出席”,例如保留出勤记录(尽管我不确定如何保留此记录……这是完全不同的事情) 所以如果我理解正确,我应该将我学生复选框的选中值存储在商店中,对吗?当这种情况发生变化时,我的组件将使用学生组件的更新位置重新渲染?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2022-01-07
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多