如何在 React (JSX) 中清除/重置状态内的数组

Posted

技术标签:

【中文标题】如何在 React (JSX) 中清除/重置状态内的数组【英文标题】:How do I clear/reset an array inside state in React (JSX) 【发布时间】:2019-11-09 21:42:38 【问题描述】:

我正在尝试使用 React 和 JSX 制作一个简单的页面,该页面将生成几个输入字段,可以通过单击按钮将其删除。

我目前正在页面状态中存储一个空数组,该数组由 addItems 函数更新。

由于某种原因,我无法使用 clear 函数清除数组。我知道setState 是异步的,但我的数组永远不会更新也永远不会消失。

"use strict";

function Node(props) 
    return(<div>
        <input type="text" placeholder="input here"></input>
    </div>);


class Page extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            arr: [],
            thresh: 5,
            del: "Delete",
        ;
        this.addItem = this.addItem.bind(this);
        this.clear = this.clear.bind(this);
    

    addItem = (index, array) => 
        if (index == this.state.thresh) 
            this.setState((state, props) => (
                arr: array,
            ));
            return;
        
        index++;
        array.push(<Node key=index />);
        this.addItem(index, array);
    ;

    clear = newArr => 
        this.setState(
            arr: newArr,
        , () =>  console.log(this.state.arr) );
    ;

    render() 
        return(<div id="wrapper onClick=() => this.addItem(0,[])>
        <div id="fields">
        this.state.arr
        </div>
        <button onClick=() => this.clear([])>this.state.del</button>
        </div>
    

ReactDOM.render(<Page />, document.getElementById("root"));

我希望当我点击删除按钮时,数组将被一个空数组覆盖,但这不会发生。我可能做错了什么?

【问题讨论】:

是点击按钮时执行的清除功能吗? "...但这并没有发生" 你有什么证据表明这没有按应有的方式工作?据我所知,您的 clear() 函数看起来是正确的。另一方面,您的addItem() 函数看起来很奇怪,尤其是因为您在调用setState() 之后 向数组推送。我建议你为你的浏览器安装 React Developer Tools 插件。这将允许您直接检查组件的状态以查看它是否正常工作。这比console.log() 更可靠。 @JosepVidal 是的,函数执行。 @Code-Apprentice 回调函数打印一个数组,其中包含元素。关于 addItem,我忘了包括我刚刚添加的一行。 【参考方案1】:

您的 clear 方法应如下所示:

clear = () => 
        this.setState(
            arr: [],
        );
    ;

您在按钮中的点击处理程序:

<button onClick=this.clear>this.state.del</button>

如果你使用箭头函数你不必在构造函数中绑定它们,你可以删除绑定的

【讨论】:

出于某种原因,这似乎仍然无法解决问题。回调函数中的 console.log() 会打印出数组中的五个元素。 在 render 中添加 cnsole.log,而不是作为 setstate 的回调【参考方案2】:

`

clear = () => 
        this.setState(
            arr: [],
        , () =>  console.log(this.state.arr) );
        setTimeout(() =>  console.log("o/p", this.state.arr); , 3000);
    ;

` 尝试放置计时器功能将起作用。它的工作原理是Acyncronasly。

【讨论】:

您不需要超时。对this.setState()的回调将在状态修改后调用。【参考方案3】:

clear 函数看起来不错,尽管当我尝试运行您的代码时,它弹出了多个错误和一个错字。 另外 addItem 方法对我来说看起来很奇怪......您没有将节点推入 state.arr 而是一直将其推入空数组。

在这里我尝试清理一下代码,尽管功能可能不是您想要的,但它证明了清理是您需要做的第一件事的概念:)

在sn-p 下面的clear 函数工作正常并且没有被修改。


function Node(props) 
    return(<div>
        <input type="text" placeholder="input here"></input>
    </div>);


class Page extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            arr: [],
            thresh: 5,
            del: "Delete",
        ;
        this.addItem = this.addItem.bind(this);
        this.clear = this.clear.bind(this);
    

    addItem(index, array) 

        var newArr = JSON.parse(JSON.stringify(this.state.arr))
        newArr.push(<Node />)
            this.setState(
              arr: newArr
            );
    

    clear(newArr) 
        this.setState(
            arr: newArr,
        , () =>  console.log(this.state.arr) );
    

    render() 
        return(<div>
        <div id="wrapper" onClick=() => this.addItem(0,[1])>asdasd</div>
          <div id="fields"> this.state.arr </div>
          <button onClick=() => this.clear([])>this.state.del</button>
        </div>)
    



ReactDOM.render(<Page />, document.getElementById("root"));

尝试在此处的代码之上构建/添加您的逻辑,它会起作用。

【讨论】:

【参考方案4】:

我注意到这里有很多问题,但我看到的一件事是您的删除按钮被包装在添加的容器中。所以每次单击删除时,它也会添加到数组中。

不过,另一方面,此代码似乎不起作用。它的编写方式看起来永远不会向状态数组添加任何内容,因此我不确定您如何看到除空数组之外的任何内容。

我相信你正在尝试完成这样的事情:

function Node(props) 
    return (<div>
        <input type="text" placeholder="input here"></input>
    </div>);


export default class ClearTest extends React.Component<any, any> 
    constructor(props: any) 
        super(props);
        this.state = 
            arr: [<Node key=1 />],
            thresh: 5
        ;
    

    addItem = () => 
        const  arr, thresh  = this.state;
        if (arr.length < thresh)
        this.setState( arr: [...(arr), <Node key=arr.length + 1 />] )
    ;

    clear = () => 
        this.setState( arr: [] , () =>  console.log(this.state.arr) );
    ;

    public render() 
        return (
            <div id="wrapper">
                <div id="fields">
                    this.state.arr
                </div>
                <button onClick=this.clear>Delete</button>
                <button onClick=this.addItem>Add</button>
            </div>
        );
    

这会将添加移动到一个按钮,并允许添加最多 5 个输入。单击删除将全部删除。

【讨论】:

谢谢你这是我的问题!我只是需要它在调用 addItems 函数后每次都不会填满【参考方案5】:

您可以尝试使用自定义重置功能对其进行重置:

import React,  Component  from 'react';

const getDefaultState = () => (
  myArray: [],
);

class MyComponent extends Component 
  constructor(props) 
    super(props);
    this.state =  ...getDefaultState() ;
  

  componentDidMount() 
    this.setState( myArray: [1, 2, 3] )
  

  resetState = () => 
    this.setState( ...getDefaultState() );
  ;

  render() 
    return (
      <div onClick=this.resetState>
        JSON.stringify(this.state.myArray)
      </div>
    );
  

【讨论】:

以上是关于如何在 React (JSX) 中清除/重置状态内的数组的主要内容,如果未能解决你的问题,请参考以下文章

在 JSX | React 如何将 prop 传递给按钮状态,以便按钮状态可以加载新页面?

React 系列导航

如何在 useEffect 中使用 setTimeout 重置 React 钩子状态

如何清除 vuex 商店中的状态?

React 子组件在父组件中更新状态后如何将其重置回原始状态

如何在 React.js 中使用 react-router-dom 保持 App() 级别状态不重置?