当前位置: 代码迷 >> JavaScript >> 泛型函数与多个状态变量反应
  详细解决方案

泛型函数与多个状态变量反应

热度:124   发布时间:2023-06-05 14:22:00.0

如何根据下拉列表编写具有各种状态变量更改的泛型函数。

例如:

我有下拉菜单1和下拉菜单2。如果我更改了

下拉菜单1,我需要更改一些状态变量,例如a,b,c

下拉菜单2,我需要更改一些状态变量,例如x,y,z

我可以用2个功能来做到这一点。 但是如何为此编写一个通用函数呢?

handleChange: function(e) {
    //api call to xyz.com/getcompany/<company id> to get the job list here
    this.setState({
      selectedCompany: e.target.value,
      companychange: "company changed. New value: " + e.target.value
    })
  },

  handleChange2: function (e) {
    // api call to xyz.com/jobstatus/<job id> to get the job status\(like how many position available for this job\) here
    this.setState({
      jobchange:"job changed. New value " + e.target.value
    })
  }

Codepen: ://codepen.io/asdhanapal/pen/WmwJPj editors 0011

您可以使用curried函数来简化代码:

 changeToState(fn) {
    return e => this.setState(fn(e));
 }

 render() {
   //...
   <input onChange={changeToState(e => ({ selectedCompany: e.target.value, /*...*/ }))} />
   <input onChange={changeToState(e => ({ jobChange: e.target.value, /*...*/ }))} />
}

如果这仍然很重要,则可以将handleChange事件提取到功能组件中:

 const StateChanger = ({ action, parent, ...props }) => (
   <input onChange={e => parent.setState(action(e))} {...props} />
 );

  // inside a component's render:
   <StateChanger parent={this} action={e => ({ selectedCompany: e.target.value })} style={{ color: red }} />

但是正如我在评论中已经提到的那样,这可能会删除重复的代码,但是它并不会提高可读性/可维护性。

您可以使用以下代码段:

handleChange = event => {
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        this.setState({
            [name]: value
        });
    };

对React docs部分的引用: :

您可以使用以下内容:

handleChange = event => {
  const { name, value } = event.target;
  this.setState({
    [name]:value
   })
}
// in input 
<input name="username" onChange={this.handleChange} />

尝试这个:

handleChange: function(source, e) {
switch(source) {
  case 'company': 
      //Need to do api call to get the job list here
      this.setState({
        selectedCompany: e.target.value,
        companychange: "company changed. New value: " + e.target.value
      })
    break;
  case 'job':
      // Need to do api call to get the job status\(like how many position available for this job\) here
      this.setState({
        jobchange:"job changed. New value " + e.target.value
      })
    break;

  };
},

 <select value={this.state.selectedCompany} onChange={this.handleChange.bind(this, 'company')}>
 <select value={this.state.selectedCompany} onChange={this.handleChange.bind(this, 'job')}>

在阅读您对需求的描述时,下拉列表1和下拉列表2之间没有功能依赖性,因此我将其分为两个单独的组件。