【问题标题】:React: Rendering second functional component when the first one is updatedReact:更新第一个功能组件时渲染第二个功能组件
【发布时间】:2021-01-17 11:55:56
【问题描述】:

我是功能组件的新手,并且很难根据localStorage 中的参数来弄清楚如何渲染彼此不相关的功能组件。我有两个组件:

第一个组件:从localStorage中获取一个变量,并且还有一个更新相同参数的按钮。

import React, { useState, useEffect } from "react";
import { monthList } from "../common/lists";

const First = () => {
  const [focusDate, setFocusDate] = useState(
    Number(localStorage.getItem("focusDate"))
  );

  useEffect(() => {}, [focusDate]);

  const month = new Date(focusDate).getMonth();
  const year = new Date(focusDate).getFullYear();

  const onClick = () => {
    setFocusDate(focusDate - 504000000); //one week
    localStorage.setItem("focusDate", focusDate);
  };

  return (
    <div>
      <i onClick={onClick} className="fas fa-chevron-left"></i>
      <div className="data">{`${monthList[month]} ${year}`}</div>
    </div>
  );
};

export default First;

第二个组件也应该显示相同的数据:

import React, { useState, useEffect } from "react";
import { monthList } from "../common/lists";

const Second = () => {
  const [focusDate, setFocusDate] = useState(
    Number(localStorage.getItem("focusDate"))
  );

  useEffect(() => {}, [focusDate]);

  const month = new Date(focusDate).getMonth();
  const year = new Date(focusDate).getFullYear();

  return (
    <div>
      <div className="data">{`${monthList[month]} ${year}`}</div>
    </div>
  );
};

export default Second;

由于我在第一个组件中更新了 localStorage,并在第二个组件中使用了 useEffect 挂钩,因此我的期望是,每当数据在第一个组件中重新渲染时,它也应该在第二个组件中重新渲染。不过,这不会发生。我在这里错过了什么?

更新: 根据下面的建议,创建了一个父组件以将 focusDate 作为道具传递,但它返回 undefined。

import React, { useState, useEffect } from "react";

//Components
import First from "../layout/First";

const DateHandler = () => {
  const [focusDate, setFocusDate] = useState(
    Number(localStorage.getItem("focusDate"))
  );

  useEffect(() => {}, [focusDate]);

  return (
    <div>
      <First focusDate={focusDate} />
    </div>
  );
};

export default DateHandler();

【问题讨论】:

  • Second 中的 props 和本地状态都没有变化,因此没有理由重新渲染。 localStorage.getItem() 返回一个静态值,它不监听本地存储更新。
  • 第二个组件需要观察第一个组件的值变化,localstorage不能实现
  • @hotpink 我如何才能听到第二个组件中的这些变化?

标签: javascript reactjs


【解决方案1】:

我在第二个中使用了 useEffect 钩子,我的期望是每当 数据在第一个组件中重新渲染,它也应该是 第二次重新渲染。

useEffect 的依赖是Second 组件的state(focusDate),在组件内的任何地方都没有更改。所以,Second 不会重新渲染。

解决方案:

state 和状态更新代码移至父组件,并将state 作为道具传递给FirstSecond 组件。

组件应该是这样的:

const DateHandler = () => {
  const [focusDate, setFocusDate] = useState(
    Number(localStorage.getItem('focusDate'))
  );

  const onClick = () => {
    setFocusDate((prevDate) => prevDate - 504000000); //one week
    localStorage.setItem('focusDate', focusDate);
  };

  return (
    <div>
      <First focusDate={focusDate} onClickHandler={onClick} />
      <Second focusDate={focusDate} />
    </div>
  );
};

export default DateHandler();

import React, { useState, useEffect } from 'react';
import { monthList } from '../common/lists';

const First = ({ focusDate, onClickHandler }) => {
  const month = new Date(focusDate).getMonth();
  const year = new Date(focusDate).getFullYear();

  return (
    <div>
      <i onClick={onClickHandler} className="fas fa-chevron-left"></i>
      <div className="data">{`${monthList[month]} ${year}`}</div>
    </div>
  );
};

const Second = ({ focusDate }) => {
  const month = new Date(focusDate).getMonth();
  const year = new Date(focusDate).getFullYear();

  return (
    <div>
      <div className="data">{`${monthList[month]} ${year}`}</div>
    </div>
  );
};

export default Second;

【讨论】:

  • 这些组件没有相同的父级。我需要某种我想不通的监听机制。
  • @Ruham 为什么不添加一个除了返回子组件之外没有任何 JSX 的父组件?
  • 我试图创建一个将 focusDate={focusDate} 传递给第一个组件的父 DateHandler(),但是在第一个组件中 props.focusDate 返回未定义。您能否提供一个解决方案的示例?
  • @Ruham 确保 localStorage 有focusDate。将家长的代码添加到问题中
  • 添加了,localstorage确实有值。
猜你喜欢
  • 2021-01-19
  • 2020-01-28
  • 2020-01-06
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多