class PlayerControls extends React.Component {
constructor(props) {
super(props)
this.state = {
loopActive: false,
shuffleActive: false,
}
}
render() {
var shuffleClassName = this.state.toggleActive ? "player-control-icon active" : "player-control-icon"
return (
<div className="player-controls">
<FontAwesome
className="player-control-icon"
name='refresh'
onClick={this.onToggleLoop}
spin={this.state.loopActive}
/>
<FontAwesome
className={shuffleClassName}
name='random'
onClick={this.onToggleShuffle}
/>
</div>
);
}
onToggleLoop(event) {
// "this is undefined??" <--- here
this.setState({loopActive: !this.state.loopActive})
this.props.onToggleLoop()
}
Saya ingin memperbarui loopActive
status pada toggle, tetapi this
objek tidak ditentukan dalam handler. Menurut dokumen tutorial, saya this
harus merujuk pada komponen. Apakah saya melewatkan sesuatu?
javascript
reactjs
this
Maximus S
sumber
sumber
() => this.onToggleLoop
setelah memindahkan fungsi onToggleLoop ke kelas reaksi Anda, itu akan berfungsi juga.this
terdefinisi sejak awal? Saya tahuthis
dalam Javascript tergantung pada bagaimana fungsinya dipanggil, tetapi apa yang terjadi di sini?Ada beberapa cara.
Salah satunya adalah menambahkan
this.onToggleLoop = this.onToggleLoop.bind(this);
konstruktor.Lainnya adalah fungsi panah
onToggleLoop = (event) => {...}
.Lalu ada
onClick={this.onToggleLoop.bind(this)}
.sumber
onClick
akan mengembalikan fungsi baru setiap render dan dengan demikian sepertinya nilai baru telah diteruskan untuk prop, mengacaukanshouldComponentUpdate
dalamPureComponent
s.Tulis fungsi Anda dengan cara ini:
Fungsi Panah Gemuk
sumber
ReferenceError: fields are not currently supported
.Saya mengalami ikatan serupa dalam fungsi render dan akhirnya melewati konteks
this
dengan cara berikut:Saya juga telah menggunakan:
sumber
Anda harus memperhatikan bahwa itu
this
tergantung pada bagaimana fungsi dipanggil yaitu: ketika suatu fungsi dipanggil sebagai metode suatu objek,this
itu diatur ke objek yang dipanggil oleh metode tersebut.this
dapat diakses dalam konteks JSX sebagai objek komponen Anda, sehingga Anda dapat memanggil metode yang Anda inginkan sebaristhis
metode.Jika Anda hanya meneruskan referensi ke fungsi / metode, tampaknya reaksi akan memanggilnya sebagai fungsi independen.
sumber
onClick={this.onToggleLoop}
ketentuan bahwa di kelas komponen Anda, Anda telah mendefinisikan bidang (properti)onToggleLoop = () => /*body using 'this'*/
Jika Anda menggunakan babel, Anda mengikat 'ini' menggunakan operator mengikat ES7 https://babeljs.io/docs/en/babel-plugin-transform-function-bind#auto-self-binding
sumber
Jika Anda memanggil metode yang Anda buat dalam metode siklus hidup seperti componentDidMount ... maka Anda hanya dapat menggunakan
this.onToggleLoop = this.onToogleLoop.bind(this)
dan fungsi panah gemukonToggleLoop = (event) => {...}
.Pendekatan normal deklarasi fungsi dalam konstruktor tidak akan bekerja karena metode siklus hidup disebut sebelumnya.
sumber
dalam kasus saya ini adalah solusinya = () => {}
sumber
Dalam kasus saya, untuk komponen tanpa kewarganegaraan yang menerima referensi dengan forwardRef, saya harus melakukan apa yang dikatakan di sini https://itnext.io/reusing-the-ref-from-forwardref-with-react-hooks-4ce9df693dd
Dari ini (onClick tidak memiliki akses yang setara dengan 'ini')
Untuk ini (berfungsi)
sumber