Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应设置状态更新道具_Javascript_Reactjs_State_Multi Select_Setstate - Fatal编程技术网

Javascript 反应设置状态更新道具

Javascript 反应设置状态更新道具,javascript,reactjs,state,multi-select,setstate,Javascript,Reactjs,State,Multi Select,Setstate,我正在开发一个组件,该组件包括多个子组件,可以选择或“激活”,如这里的命名所示。。我有一个ID数组,应该在选择所有ID时对其进行初始化,因此this.state.activeSensors指的是传感器的总列表:this.props.mainViewSensors。 sensorSelect功能获取ID,并据此确定是否选中。我的方法是检查它是否在activeSensors列表中——如果它在那里就删除它,如果它不在,就添加它。设置新状态 当我从新列表newActiveSensors中删除一个项目并调

我正在开发一个组件,该组件包括多个子组件,可以选择或“激活”,如这里的命名所示。。我有一个ID数组,应该在选择所有ID时对其进行初始化,因此this.state.activeSensors指的是传感器的总列表:this.props.mainViewSensors。 sensorSelect功能获取ID,并据此确定是否选中。我的方法是检查它是否在activeSensors列表中——如果它在那里就删除它,如果它不在,就添加它。设置新状态

当我从新列表newActiveSensors中删除一个项目并调用setState时,单击的项目不知何故也会从道具中消失。我不知道这是可能的。是我做错了什么吗

以下是我所做的:

const propTypes = {
  mainViewSensors: PropTypes.arrayOf(PropTypes.string),
};

const defaultProps = {
    mainViewSensors: [
        '21EL',
        '05LO',
        '08HT',
        '81EL',
        '05TF',
    ],
}

class Multiselect extends React.Component {
    constructor(props) {
        super(props);
        this.sensorSelect = this.sensorSelect.bind(this);
        this.state = {
            activeSensors: this.props.mainViewSensors,
            selectedSensors: this.props.mainViewSensors,
        };
    }

  sensorSelect(sensor) {
    const newActiveSensors = this.state.activeSensors;
    if (newActiveSensors.includes(sensor)) {
        const index = newActiveSensors.indexOf(sensor);
        newActiveSensors.splice(index, 1);
    } else {
        newActiveSensors.push(sensor);
    }
    this.setState({
        activeSensors: newActiveSensors,
    });
  }

    render() {
    const { selectedSensors, activeSensors } = this.state;

    return (
    <div className="wrapper">
        {this.state.selectedSensors.map((tag) => (
            <div key={tag} role="button" className="main-gauge-holder" onClick={this.sensorSelect(tag)}>
                <MainGauge tag={tag} />
            </div>
        ))}
    </div>
    );
  }
}

Multiselect.propTypes = propTypes;
Multiselect.defaultProps = defaultProps;

React.render(<Multiselect />, document.getElementById('container'));
为了说明这一点,我做了这样的事情,绿色箭头显示选择了哪一个,我已经手动更改了子组件中的活动状态:

这实际上不是React问题,您只需在类上使用相同的数组实例即可。为了使用它的副本,你必须这样做

请参见我的示例以获得澄清:

var primaryArray=[1,2,3]; console.log'Init:'; console.logprimaryArray; var obj={ array:primaryArray,//同一实例 clonedArray:primaryArray.slice//Clone }; console.logobj; 日志“从同一实例中弹出:”; obj.array.pop; console.logobj; console.logprimaryArray; log“从克隆阵列中弹出不会影响主阵列:”; obj.clonedArray.pop; console.logobj;
console.logprimaryArray;哦,天哪,这真是妙不可言!我认为函数开始时的const确实复制了一个副本,我没有多考虑它,因为我的注意力都集中在了道具的改变上。。非常感谢你!