如何在reactjs中获取先前的状态值

Posted

技术标签:

【中文标题】如何在reactjs中获取先前的状态值【英文标题】:How to get previous state value in reactjs 【发布时间】:2019-09-30 20:35:35 【问题描述】:

当我点击 New Number 按钮 时,我会得到一个从 0 到 15 的随机数...这很好用,但现在我想要点击 Previous Number 按钮 ,它给了我以前的数字/状态。

例如..

渲染运行后我得到 12。然后我点击 New Number 按钮 给我 4,现在我想要当我点击 Previous Number 这改变状态和给我之前状态的数字,是4。 如何实现这个功能...

我知道 componendDidUpdateprevPropprevState 参数,但不知道如何在点击时调用它。 这是我的代码

class App extends React.Component 
   state = 
      randomNum: ''
   

   componentDidMount() 
      this.getNewRandomNum()
   

   getNewRandomNum = () => 
      let randomNum = Math.floor(Math.random() * 15)
      this.setState( randomNum )
      console.log(this.state.randomNum)
   

   prevNum = () => 

   
   render() 
      return (
         <div>
            <h1>this.state.randomNum</h1>
            <button onClick=this.getNewRandomNum>New Number</button>
            <button onClick=this.prevNum>Previous Number</button>
         </div>
      )
   

感谢您的帮助,希望我清楚。

【问题讨论】:

只需在状态中存储一个previousNum,并在获得新值时将其更新为以前的值。 Basit,刚刚给你写了一个答案,让我知道这是否适合你;。 【参考方案1】:

创建一个额外的状态值,如 previousNum,并在您调用 getRandomNum 时使用 prevState 更新它。

class App extends React.Component 
  state = 
    randomNum: "",
    previousNum: ""
  ;

  componentDidMount() 
    this.getNewRandomNum();
  

  getNewRandomNum = () => 
    let randomNum = Math.floor(Math.random() * 15);
    this.setState(
      prevState => 
        return 
          randomNum: randomNum,
          previousNum: prevState.randomNum
        ;
      ,
      () => console.log(this.state)
    );
  ;

  getPreviousNum = () => 
    this.setState(
      randomNum: this.state.previousNum,
      previousNum: ""
    , () => console.log(this.state));
  ;

  render() 
    return (
      <div>
        <h1>this.state.randomNum</h1>
        <button onClick=this.getNewRandomNum>New Number</button>
        <button
          onClick=this.getPreviousNum
          disabled=typeof(this.state.previousNum) === "number" ? false : true
        >
          Previous Number
        </button>
      </div>
    );
  

还有沙盒:https://codesandbox.io/s/7345kyly21

【讨论】:

【参考方案2】:

我只是将之前的数字存储在状态中,这是最简单和最常用的方法。

class App extends React.Component 
   state = 
      randomNum: '',
      previousNum: ''
   

   componentDidMount() 
      this.getNewRandomNum();
   

   getNewRandomNum = () => 
      let randomNum = Math.floor(Math.random() * 15)
      this.setState((state) => (  // this is the current state
         
          previousNum: state.randomNum, // this will be the previous randomNumber
          randomNum
       ));
       console.log(randomNum);
   

   prevNum = () => 
     alert(this.state.previousNum); // put whatever code you need here
   

   render() 
      return (
         <div>
            <h1>this.state.randomNum</h1>
            <button onClick=this.getNewRandomNum>New Number</button>
            <button onClick=this.prevNum>Previous Number</button>
         </div>
      );
   

【讨论】:

【参考方案3】:

我会使用 Redux 使状态更改更可预测且更易于操作。 取自文档上的 this 示例。

基本上,您的状态将如下所示:


  counter: 
    past: [0, 1, 2],
    present: 3,
    future: [4]
  

然后您使用reducers 来移动这些值。

这样你只需要打电话给dispatch 告诉它'undo''redo' 而不是每次你需要时间旅行时移动值。

Redux 真的很棒!

【讨论】:

【参考方案4】:

我建议如下使用新状态:-

const [prevStart, setPrevStart] = useState(1);
const [page, setPage] = useState(1);

const handelPage = (getPage) => 
    if (getPage < prevStart) 
        ///
    
    if (getPage > prevStart) 
        //
    
    const target = `?page=$getPage`
    createBrowserHistory().push(
        pathname: target,
    );
    setPrevStart(getPage);
    setPage(getPage);

或者你可以使用 useRef 钩子来保存之前的状态。 c

onst [name, setName] = useState("");
    const prevName = useRef("");

    useEffect(() => 
prevName.current = name;
    ,[name]);

return (
<>
name
prevName.current
</>

)

这样的事情会解决这个问题。

谢谢

【讨论】:

以上是关于如何在reactjs中获取先前的状态值的主要内容,如果未能解决你的问题,请参考以下文章

React JS:setState中的previousState在状态更新后不保留先前状态的数据

如何在 ReactJS 中将更改的状态从子组件传递给其父组件

如何从 Reactjs 中的 useEffect 挂钩访问道具

React js,如何在输入更改时更新状态对象值? [复制]

Reactjs如何在状态中初始化数组对象

React.js:在更改状态的输入字段中单击取消时如何返回先前的状态值[重复]