【问题标题】:How to do a push with the current state如何使用当前状态进行推送
【发布时间】:2019-06-20 09:51:30
【问题描述】:

我正在创建一个带有标签的应用程序。这些选项卡是通过单击菜单项创建的。 我的问题是创建了重复的选项卡。如果您已经单击了一个菜单项,我需要您什么都不做(不要将它添加到我的数组中)。 console.log (newArrayTabs) 完美运行,不会向我的数组添加元素,但我不知道如何在push 中使用它。如果在push 我尝试使用newArrayTabs 它不起作用。

我用@FunkeyFlo 编辑了我的代码并更改了一些代码。这是解决我的问题的正确代码

class App extends Component {
    constructor(props, context){
        super(props, context);

        ["openTabs",].forEach((method) => {
            this[method] = this[method].bind(this);
        });

        this.state = {
            navigation: {
                menu: [],
            },
            tabs:{
                tabsLi:[],    
            },

            textvalue : "",
            showtabs: true,
        }
    }

    componentDidMount() {
        fetch('json_menuFIN.php')
            .then(response => response.json())
            .then(data =>{
                this.setState({navigation: data});
                //console.log(data)
            })
    }

    openTabs(e, url, iframe, trdtitle){
        e.preventDefault();
                const { tabs } = this.state;
        this.setState({
            showtabs: false,
        })
        if (this.state.tabs.tabsLi.includes(trdtitle) === false){
            this.setState({
                tabs: { tabsLi:[...new Set(this.state.tabs.tabsLi),trdtitle]},
            })
        }
    }
class Tabs extends Component {
    render(){
        return(
            <div id="content-tabs" className="tabs">
            {( this.props.showtabs)  
                ? (
                    <>
                    <div className="waiting-leads">
                        <p>Parece que todavía no hay ningún lead...</p>
                        <h3>¡Ánimo, ya llega!</h3>
                        <img src={imgDinosaurio} alt="Dinosaurio"></img>
                    </div>
                    </>
                ) : (
                    <ul id="resizable" className="content" >
                        <List list={this.props.tabs.tabsLi} />
                    </ul>
            )}
            </div>
        );
    }
}

const List = (props) => {
    return (
        <>
        {props.list.map((value, index) =>         
            <li key={index}>
                <span>{value}</span>
                <Icon icon="cerrar" className='ico-cerrar' /*onClick={remove_tab(index)}*//>
            </li>
        )}
        </>
    )
}

【问题讨论】:

  • 为什么要推送到已经用 setState 发送的状态对象?
  • 我已经编辑了我的代码。每次单击菜单项时,我都需要使用push 来绘制&lt;li&gt;(它位于不同的组件中)

标签: javascript reactjs setstate


【解决方案1】:

您的示例有点令人困惑,因为 tabs 和 tabsLi 似乎被提供给状态,并且 tabsLi 包含在 tabs(?) 中

但是要更新您所在州的数组,您可以改为执行以下操作

  openTabs(e, url, iframe, trdtitle) {
    e.preventDefault();

    const { tabs } = this.state;
    this.setState({
      //...
      tabsLi: [...tabs.tabsLi, trdtitle], //instead of push
      //...
    })
  }

编辑:它也适用于组件

import React, { Component } from 'react';
import { render } from 'react-dom';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: 'React',
      listObj: { list: ['first value'] }
    };
  }

  onClick = () => {
    const newValue = 'new value';

    const { listObj } = this.state;
    this.setState({
      //...
      listObj: { list: [...listObj.list, newValue] }, //instead of push
      //...
    })
  }

  render() {
    return (
      <div onClick={this.onClick}>
        <List list={this.state.listObj.list} />
      </div>
    );
  }
}

const List = (props) => {
  return <div>{props.list.map((i) => <div>{i}</div>)}</div>
}

render(<App />, document.getElementById('root'));

【讨论】:

  • 代码不起作用,也没有显示任何错误。我已经添加了组件,以便了解我需要在哪里使用它。
  • 我已经更新了我的代码,但它仍然不起作用。包含我的旧代码的组件部分确实可以工作,但该函数没有绘制任何内容。
  • 在您的代码中,我的部分状态丢失了。怪我没有从一开始就写下我的原始陈述。目前它可以工作,但和以前一样,显示所有元素,我们需要使用new Set,所以没有重复。我一开始也有同样的问题...
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2011-08-18
  • 2020-12-10
相关资源
最近更新 更多