我正在创建带有标签的应用程序。这些选项卡是通过单击菜单项创建的。
我的问题是创建了重复的选项卡。如果您已经单击了菜单项,则无需执行任何操作(请勿将其添加到我的数组中)。
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>
)}
</>
)
}
答案 0 :(得分:0)
您的示例有点令人困惑,因为似乎向状态提供了tabs和tabsLi以及tabs(?)中包含的tabsLi
但是要更新您所在状态的数组,您可以执行以下操作
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'));