Dalam Bereaksi, apakah ada perbedaan nyata antara kedua implementasi ini? Beberapa teman mengatakan kepada saya bahwa FirstComponent adalah polanya, tetapi saya tidak mengerti mengapa. Komponen Kedua tampaknya lebih sederhana karena render disebut hanya sekali.
Pertama:
import React, { PropTypes } from 'react'
class FirstComponent extends React.Component {
state = {
description: ''
}
componentDidMount() {
const { description} = this.props;
this.setState({ description });
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default FirstComponent;
Kedua:
import React, { PropTypes } from 'react'
class SecondComponent extends React.Component {
state = {
description: ''
}
constructor (props) => {
const { description } = props;
this.state = {description};
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default SecondComponent;
Pembaruan: Saya mengubah setState () ke this.state = {} (thanks joews), Namun, saya masih tidak melihat perbedaannya. Apakah yang satu lebih baik dari yang lain?
javascript
reactjs
components
Levy Moreira
sumber
sumber
this.state = { isVisible: props.isVisible }
masuk akal. Tergantung pada bagaimana aplikasi mendistribusikan keadaan UI.Jawaban:
Perlu dicatat bahwa ini adalah anti-pola untuk menyalin properti yang tidak pernah berubah ke keadaan (cukup akses .props langsung dalam kasus itu). Jika Anda memiliki variabel keadaan yang pada akhirnya akan berubah tetapi dimulai dengan nilai dari .props, Anda bahkan tidak memerlukan panggilan konstruktor - variabel lokal ini diinisialisasi setelah panggilan ke konstruktor induk:
Ini adalah singkatan yang setara dengan jawaban dari @ yoews di bawah ini. Tampaknya hanya bekerja pada versi yang lebih baru dari es6 transpiler, saya memiliki masalah dengan itu pada beberapa pengaturan webpack. Jika ini tidak berhasil untuk Anda, Anda dapat mencoba menambahkan plugin babel
babel-plugin-transform-class-properties
, atau Anda dapat menggunakan versi non-steno oleh @ joews di bawah ini.sumber
Anda tidak perlu memanggil
setState
Komponenconstructor
- itu idiomatis untuk mengaturthis.state
langsung:Lihat Bereaksi dokumen - Menambahkan Status Lokal ke Kelas .
Tidak ada keuntungan dengan metode pertama yang Anda gambarkan. Ini akan menghasilkan pembaruan kedua segera sebelum memasang komponen untuk pertama kalinya.
sumber
setState
jika Anda memutasinya di titik lain, jika tidak perubahan itu tidak akan merender.super(props)
di konstruktor. Diskusi tentang SOPembaruan untuk Bereaksi 16.3 alfa diperkenalkan
static getDerivedStateFromProps(nextProps, prevState)
( dokumen ) sebagai pengganticomponentWillReceiveProps
.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
Itu statis, oleh karena itu ia tidak memiliki akses langsung ke
this
(tetapi ia memiliki akses keprevState
, yang dapat menyimpan hal-hal yang biasanya terpasangthis
misalnyarefs
)diedit untuk mencerminkan koreksi @ nerfologist dalam komentar
sumber
getDerivedStateFromProps
(tandai huruf kapital di Props) dan params adalahnextProps
,prevState
(tidaknextState
): reactjs.org/docs/…getDerivedStateFromProps
selalu dipanggil sebelum rendering awal?Anda bisa menggunakan formulir pendek seperti di bawah ini jika Anda ingin menambahkan semua alat peraga untuk menyatakan dan mempertahankan nama yang sama.
sumber
atur data keadaan di dalam konstruktor seperti ini
itu tidak akan berfungsi jika Anda mengatur di sisi componentDidMount () metode melalui alat peraga.
sumber
sumber
state = props
. Info lebih lanjut di sini: github.com/facebook/react/pull/11658#issuecomment-419677176Anda bisa menggunakan
key
nilai untuk mengatur ulang keadaan saat dibutuhkan, lulus alat peraga untuk menyatakan itu bukan praktik yang baik, karena Anda memiliki komponen yang tidak terkontrol dan dikendalikan di satu tempat. Data harus di satu tempat ditangani, baca https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recomendation-fully-uncontrolled-component-with-a -kuncisumber
Anda dapat menggunakan componentWillReceiveProps.
sumber
ANDA HARUS HATI-HATI saat Anda menginisialisasi
state
dariprops
dalam konstruktor. Bahkan jikaprops
diubah ke yang baru, keadaan tidak akan berubah karena mount tidak pernah terjadi lagi. JadigetDerivedStateFromProps
ada untuk itu.sumber