Saya memiliki komponen berikut ( radioOther.jsx
):
'use strict';
//module.exports = <-- omitted in update
class RadioOther extends React.Component {
// omitted in update
// getInitialState() {
// propTypes: {
// name: React.PropTypes.string.isRequired
// }
// return {
// otherChecked: false
// }
// }
componentDidUpdate(prevProps, prevState) {
var otherRadBtn = this.refs.otherRadBtn.getDOMNode();
if (prevState.otherChecked !== otherRadBtn.checked) {
console.log('Other radio btn clicked.')
this.setState({
otherChecked: otherRadBtn.checked,
});
}
}
onRadChange(e) {
var input = e.target;
this.setState({
otherChecked: input.checked
});
}
render() {
return (
<div>
<p className="form-group radio">
<label>
<input type="radio"
ref="otherRadBtn"
onChange={this.onRadChange}
name={this.props.name}
value="other"/>
Other
</label>
{this.state.otherChecked ?
(<label className="form-inline">
Please Specify:
<input
placeholder="Please Specify"
type="text"
name="referrer_other"
/>
</label>)
:
('')
}
</p>
</div>
)
}
};
Sebelum menggunakan ECMAScript6 semuanya baik-baik saja, sekarang saya mendapatkan 1 kesalahan, 1 peringatan dan saya memiliki pertanyaan tindak lanjut:
Kesalahan: TypeError Tidak Tertangkap: Tidak dapat membaca properti 'otherChecked' dari null
Peringatan: getInitialState didefinisikan di RadioOther, kelas JavaScript biasa. Ini hanya didukung untuk kelas yang dibuat menggunakan React.createClass. Apakah Anda bermaksud mendefinisikan properti negara?
Adakah yang bisa melihat di mana letak kesalahan, saya tahu itu karena pernyataan bersyarat di DOM tetapi ternyata saya tidak menyatakan nilai awalnya dengan benar?
Haruskah saya membuat getInitialState menjadi statis
Di mana tempat yang tepat untuk mendeklarasikan proptypes saya jika getInitialState salah?
MEMPERBARUI:
RadioOther.propTypes = {
name: React.PropTypes.string,
other: React.PropTypes.bool,
options: React.PropTypes.array }
module.exports = RadioOther;
@ssorallen, kode ini:
constructor(props) {
this.state = {
otherChecked: false,
};
}
menghasilkan "Uncaught ReferenceError: this is not defined"
, dan sementara di bawah mengoreksinya
constructor(props) {
super(props);
this.state = {
otherChecked: false,
};
}
tetapi sekarang, mengklik tombol lain sekarang menghasilkan kesalahan:
Uncaught TypeError: Cannot read property 'props' of undefined
sumber
onChange={this.onRadChange}
,this
tidak merujuk ke instance saatonRadChange
dipanggil. Anda perlu callback mengikat dalamrender
atau melakukannya di constructor:onChange={this.onRadChange.bind(this)}
.Jawaban:
getInitialState
tidak digunakan di kelas ES6. Sebagai gantinya tetapkanthis.state
di konstruktor.propTypes
harus variabel kelas statis atau ditugaskan ke kelas, itu tidak boleh ditugaskan ke contoh komponen.Lihat lebih lanjut dalam dokumentasi React tentang ES6 Classes: Mengubah Fungsi menjadi Class
sumber
Uncaught TypeError: Cannot read property 'bind' of undefined
error Ada ide?render
Anda dapat melakukan sesuatu sepertionClick={this.doFoo.bind(this)}
, tetapi saya sengaja tidak memasukkannya ke dalam kode karena itulah cara yang paling tidak efisien untuk mengikat karenarender
dapat sering dipanggil dan akan membuat fungsi baru pada setiap panggilan. Saya akan menghapus bahasa itu dari jawabannya.Menambah jawaban Ross .
Anda juga bisa menggunakan fungsi panah ES6 baru di properti onChange
Ini secara fungsional setara dengan mendefinisikan
this.onRadChange = this.onRadChange.bind(this);
di konstruktor tetapi lebih ringkas menurut saya.Dalam kasus Anda, tombol radio akan terlihat seperti di bawah ini.
Memperbarui
Metode "lebih ringkas" ini kurang efisien daripada opsi yang disebutkan dalam jawaban @Ross Allen karena menghasilkan fungsi baru setiap kali
render()
metode tersebut dipanggilsumber
render
(yang dapat dipanggil berkali-kali). Dengan menggunakan penginisialisasi properti kelas atau pengikatan dalam konstruktor, hanya satu Fungsi terikat baru yang dibuat pada konstruksi komponen dan tidak ada Fungsi baru yang dibuat selamarender
.Jika Anda menggunakan babel-plugin-transform-class-properties atau babel-preset-stage-2 (atau stage-1, atau stage-0), Anda dapat menggunakan sintaks ini:
sumber