亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法訪問事件處理程序中的反應性實例(此)

無法訪問事件處理程序中的反應性實例(此)

陪伴而非守候 2019-05-30 17:05:11
無法訪問事件處理程序中的反應性實例(此)我正在用ES6(使用BabelJS)和函數編寫一個簡單的組件this.setState不起作用了。典型的錯誤包括無法讀取未定義的屬性“setstate”或setState不是函數你知道為什么嗎?以下是代碼:import React from 'react'class SomeClass extends React.Component {   constructor(props) {     super(props)     this.state = {inputContent: 'startValue'}   }   sendContent(e) {     console.log('sending input content '+React.findDOMNode(React.refs.someref).value)   }   changeContent(e) {     this.setState({inputContent: e.target.value})   }    render() {     return (       <div>         <h4>The input form is here:</h4>         Title:          <input type="text" ref="someref" value={this.inputContent}            onChange={this.changeContent} />          <button onClick={this.sendContent}>Submit</button>       </div>     )   }}export default SomeClass
查看完整描述

3 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

this.changeContent需要通過this.changeContent.bind(this)作為onChange道具,否則this函數主體中的變量將不引用組件實例,而是引用window??匆?/trans>功能:綁定.

使用時React.createClass而不是ES6類,定義在組件上的每個非生命周期方法都會自動綁定到組件實例。看見自動綁定.

請注意,綁定函數會創建一個新函數。您可以直接在呈現中綁定它,這意味著每次組件呈現時都會創建一個新函數,或者在構造函數中綁定它,而構造函數只會觸發一次。

constructor() {
  this.changeContent = this.changeContent.bind(this);}

VS

render() {
  return <input onChange={this.changeContent.bind(this)} />;}

參考文獻是在組件實例上設置的,而不是在React.refs:你需要改變React.refs.somerefthis.refs.someref。您還需要綁定sendContent方法到組件實例,以便this提到它。


查看完整回答
反對 回復 2019-05-30
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

這個問題是我們大多數人在從React.createClass()擴展ES6類的組件定義語法React.Component.

它是由this背景差異React.createClass()VSextends React.Component.

使用React.createClass()將自動綁定this上下文(值)正確,但在使用ES6類時并非如此。當使用ES6方式時(通過擴展React.Component)this上下文是null默認情況下。類的屬性不會自動綁定到Reaction類(組件)實例。


解決這一問題的途徑

我一共知道4種一般的方法。

  1. 將函數綁定到類構造函數中。許多人認為這是一種最佳實踐方法,它完全避免觸及JSX,并且不會為每個組件重新呈現創建一個新功能。

    class SomeClass extends React.Component {
      constructor(props) {
        super(props);
        this.handleClick = this.handleClick.bind(this);
      }
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick}></button>
        );
      }}
  2. 將函數內聯綁定。您仍然可以在一些教程/文章/等等中發現這種方法,因此您必須了解它。它的概念與#1相同,但要注意的是,綁定函數在每次重呈現時都會創建一個新函數。

    class SomeClass extends React.Component {
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick.bind(this)}></button>
        );
      }}
  3. 使用胖箭頭函數。直到箭頭函數,每個新函數都定義了自己的函數。this價值。但是,箭頭函數不創建自己的this上下文,所以this具有來自Reaction組件實例的原始含義。因此,我們可以:

    class SomeClass extends React.Component {
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={ () => this.handleClick() }></button>
        );
      }}

    class SomeClass extends React.Component {
      handleClick = () => {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick}></button>
        );
      }}
  4. 使用實用程序函數庫自動綁定函數。有一些實用程序庫可以自動為您完成任務。以下是一些流行的,僅舉幾個例子:

    • 自動裝配器是將類的方法綁定到this,即使在分離方法時也是如此。包裹使用@autobind在綁定方法之前this指向正確的引用組件的上下文。

      import autobind from 'autobind-decorator';class SomeClass extends React.Component {
        @autobind
        handleClick() {
          console.log(this); // the React Component instance
        }
        render() {
          return (
            <button onClick={this.handleClick}></button>
          );
        }}

      AutoBindDecorator非常聰明,可以讓我們一次綁定組件類中的所有方法,就像方法1一樣。

    • 類自動綁定是另一個廣泛用于解決此綁定問題的NPM包。與AutoBindDecorator不同,它不使用裝飾器模式,而是真正使用只需在構造函數中使用一個自動綁定的函數。組件的方法以正確引用this.

      import autobind from 'class-autobind';class SomeClass extends React.Component {
        constructor() {
          autobind(this);
          // or if you want to bind only only select functions:
          // autobind(this, 'handleClick');
        }
        handleClick() {
          console.log(this); // the React Component instance
        }
        render() {
          return (
            <button onClick={this.handleClick}></button>
          );
        }}

      PS:其他非常類似的圖書館是反應自綁定.


建議

如果我是你,我會堅持第一種方法。但是,一旦您在類構造函數中獲得了大量的綁定,我將建議您探索方法4中提到的一個助手庫。


其他

這與你所面臨的問題無關,但你不應過度使用參考文獻.

你的第一個傾向可能是在你的應用程序中使用參考文獻來“讓事情發生”。如果是這樣的話,花點時間更仔細地考慮一下在組件層次結構中應該在哪里擁有狀態。

為了類似的目的,就像您需要的一樣,使用受控元件是首選的方法。我建議你考慮用你的元件state。因此,您可以簡單地訪問如下所示的值:this.state.inputContent.


查看完整回答
反對 回復 2019-05-30
  • 3 回答
  • 0 關注
  • 725 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號