javascript - 从子组件更新父状态并在更新父状态时重新渲染该子组件

标签 javascript reactjs

我正在学习 React,我整天都在努力寻找解决问题的方法,但没有成功。然后决定在这里提出我的第一个问题。

我有一个子组件,包括 React-Datepicker 组件和单独的“第二天”和“前一天”按钮来更改所选日期。

SelectedDate 存储在父组件的状态中。

我试图从子组件更新父组件的状态,然后当状态更新时子组件应该重新渲染,因为这个状态作为 Prop 传递给同一个子组件。

我已设法将父状态从子状态更改为子状态,但子组件未重新呈现,因此 Datepicker 日期未更新。

我该如何解决这个问题?

下面是我没有导入行的代码。

// App.js

function App() {
  const [selectedDate, setSelectedDate] = useState(new Date())

  const incrementDate = () => {
    let next = selectedDate
    next.setDate(next.getDate() + 1)

    setSelectedDate(next)
  }

  const decrementDate = () => {
    let previous = selectedDate
    previous.setDate(previous.getDate() - 1)

    setSelectedDate(previous)
  }

  return (
    <div className="App">
      <Child 
        selectedDate={selectedDate}
        setSelectedDate={setSelectedDate}
        decrementDate={decrementDate}
        incrementDate={incrementDate} />
    </div>
  )
}

// Child.js

const Child = ({ selectedDate, setSelectedDate, decrementDate, incrementDate }) => {
  return (
    <div className='datepicker-wrapper'>
      <ArrowLeft className='date-arrow' onClick={decrementDate} />
        <DatePicker
          selected={selectedDate}
          onChange={(date) => setSelectedDate(date)}
        />
      <ArrowRight className='date-arrow' onClick={incrementDate} />
    </div>
  )
}

解决方案:

递增和递减函数的变化:

let next = new Date(selectedDate.valueOf())
let previous = new Date(selectedDate.valueOf())

最佳答案

当您使用 React 更新状态时,您应该始终创建新的状态对象,而不仅仅是改变现有状态。

  const incrementDate = () => {
    let next = new Date(selectedDate.valueOf())
    next.setDate(next.getDate() + 1)
    setSelectedDate(next)
  }

  const decrementDate = () => {
    let previous = new Date(selectedDate.valueOf())
    previous.setDate(previous.getDate() - 1)
    setSelectedDate(previous)
  }

React 进行了各种优化,以便子组件仅在状态发生变化时才重新呈现。许多 javascript 方法,如 Date.setDate() 将原地改变原始对象。简单地使用 let previous = selectedDate 分配一个新名称将不会创建一个新的 Date 对象。要创建新日期,您必须在更新程序函数中的某处使用 new Date()

关于javascript - 从子组件更新父状态并在更新父状态时重新渲染该子组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65492233/

相关文章:

javascript - 如何将所有导入的模块存储在一个文件中

javascript - 循环遍历 App.Car.find() 的结果

javascript - 在 ASP.NET MVC 中使用 HtmlHelper 构造 URL

javascript - 将图像从 Base64 解码为 jpg

javascript - 为什么此 Javascript 行只包含函数名称和函数调用?

node.js - 在reactApp创建中使用Webpack时出错-configuration.output.path : The provided value "./" is not an absolute path!“

javascript - 单击时显示数组中的最后一个索引(在持续更新的数组中)

javascript - 渲染多个子组件的最佳方式

javascript - 无法根据 react 列表创建路由

javascript - 当鼠标悬停在容器的 1/3 宽度上时使内容可见,而不添加子容器