復用事件處理函數

  1. 在React中,有時一個組件中會有多個事件處理函數,代碼格式上差別不大,這樣往往會造成重復的編寫類似的代碼
handleChange1...
handleChange2...
handleChange3...
  • 多事件處理函數示例
    class ConstrolInput extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          name: 'hello world',
          selected: 'boy',
          checked: false
        };

        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleInput = this.handleInput.bind(this);
        this.handleSelected = this.handleSelected.bind(this);
        this.handleCheck = this.handleCheck.bind(this);
      }
      handleSubmit(event) {
        event.preventDefault(); 
        console.log(this.state);
      }
      handleInput(e) {
        this.setState({name: e.target.value});
      }
      handleSelected(e) {
        this.setState({selected: e.target.value});
      }
      handleCheck(e) {
        this.setState({checked: e.target.checked});
      }
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <p>
              <input defaultValue={this.state.name} onChange={this.handleInput} />
            </p>
            <p>
              <select value={this.state.selected} onChange={this.handleSelected}>
                <option value="boy">男</option>
                <option value="girl">女</option>
              </select>
            </p>
            <p>
              <label>
                <input type="checkbox" checked={this.state.checked} onChange={this.handleCheck} />
                請閱讀條款
              </label>
              <button type="submit">Alert</button>
            </p>
          </form>
        );
      }
    }
  1. 解決的方法是將這類處理函數整合成一個函數onChange={this.handleChange}
  • bind 復用: 利用bind在綁定this的時候能預先傳入參數的特性
    class ConstrolInput extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          name: 'hello world',
          selected: 'boy',
          checked: false
        };

        this.handleSubmit = this.handleSubmit.bind(this);
      }
      handleSubmit(event) {
        event.preventDefault(); 
        console.log(this.state);
      }
      handleChange(name, event) {
        let newState= {};
        newState[name] = name === "checked" ? event.target.checked
          : event.target.value;
        this.setState(newState);
      }
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <p>
              <input defaultValue={this.state.name} onChange={this.handleChange.bind(this, 'name')} />
            </p>
            <p>
              <select value={this.state.selected} onChange={this.handleChange.bind(this, 'selected')}>
                <option value="boy">男</option>
                <option value="girl">女</option>
              </select>
            </p>
            <p>
              <label>
                <input type="checkbox" checked={this.state.checked} onChange={this.handleChange.bind(this, 'checked')} />
                請閱讀條款
              </label>
              <button type="submit">Alert</button>
            </p>
          </form>
        );
      }
    }
  • name 復用:設置對應的 name 屬性
    class ConstrolInput extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          name: 'hello world',
          selected: 'boy',
          checked: false
        };

        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChange = this.handleChange.bind(this);
      }
      handleSubmit(event) {
        event.preventDefault(); 
        console.log(this.state);
      }
      handleChange(event) {
        let newState= {};
        const name = event.target.name;
        newState[name] = name === 'checked' ? event.target.checked
          : event.target.value;
        this.setState(newState);
      }
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <p>
              <input name="name" defaultValue={this.state.name} onChange={this.handleChange} />
            </p>
            <p>
              <select name="selected" value={this.state.selected} onChange={this.handleChange}>
                <option value="boy">男</option>
                <option value="girl">女</option>
              </select>
            </p>
            <p>
              <label>
                <input name="checked" type="checkbox" checked={this.state.checked} onChange={this.handleChange} />
                請閱讀條款
              </label>
              <button type="submit">Alert</button>
            </p>
          </form>
        );
      }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,122評論 2 17
  • 本筆記基于React官方文檔,當前React版本號為15.4.0。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,931評論 14 128
  • 龔灘古鎮(zhèn)位于重慶酉陽縣西,烏江與阿蓬江匯流的峽谷之中。依山就勢,臨水而起,自古經營著一條大河的航運,古樸如...
    添冰者閱讀 444評論 0 2
  • 我在此之前從來不知道想念一個人會默默的流眼淚,仿佛眼睛是那關不住的水龍頭一樣滴答滴答。心疼。 今天無意之間在朋友圈...
    樹皮醬閱讀 403評論 0 0

友情鏈接更多精彩內容