useState()
bir React kancasıdır. Kancalar, işlev bileşenlerinin içinde durum ve değişkenliği kullanmayı mümkün kılar.
Sınıflar içinde kanca kullanamasanız da, sınıf bileşeninizi bir işlevle sarabilir ve ondan kancalar kullanabilirsiniz. Bu, bileşenleri sınıftan işlev biçimine taşımak için harika bir araçtır. İşte eksiksiz bir örnek:
Bu örnek için bir sayaç bileşeni kullanacağım. Budur:
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = { count: props.count };
}
inc() {
this.setState(prev => ({count: prev.count+1}));
}
render() {
return <button onClick={() => this.inc()}>{this.state.count}</button>
}
}
ReactDOM.render(<Hello count={0}/>, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'></div>
Sayma durumuna sahip basit bir sınıf bileşenidir ve durum güncellemesi yöntemlerle yapılır. Bu, sınıf bileşenlerinde çok yaygın bir modeldir. İlk şey, tüm özelliklerini sarılmış bileşene atayan, aynı ada sahip bir işlev bileşeniyle sarmalamaktır. Ayrıca, işlev dönüşünde sarmalanmış bileşeni de oluşturmalısınız. İşte burada:
function Hello(props) {
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = { count: props.count };
}
inc() {
this.setState(prev => ({count: prev.count+1}));
}
render() {
return <button onClick={() => this.inc()}>{this.state.count}</button>
}
}
return <Hello {...props}/>
}
ReactDOM.render(<Hello count={0}/>, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'></div>
Bu, aynı davranışa, aynı ada ve aynı özelliklere sahip, tamamen aynı bileşendir. Şimdi sayma durumunu fonksiyon bileşenine kaldıralım. Bu işler böyle yürür:
function Hello(props) {
const [count, setCount] = React.useState(0);
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = { count: props.count };
}
inc() {
this.setState(prev => ({count: prev.count+1}));
}
render() {
return <button onClick={() => setCount(count+1)}>{count}</button>
}
}
return <Hello {...props}/>
}
ReactDOM.render(<Hello count={0}/>, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js" integrity="sha256-3vo65ZXn5pfsCfGM5H55X+SmwJHBlyNHPwRmWAPgJnM=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js" integrity="sha256-qVsF1ftL3vUq8RFOLwPnKimXOLo72xguDliIxeffHRc=" crossorigin="anonymous"></script>
<div id='root'></div>
Yöntemin inc
hala orada olduğunu, kimseye zarar vermeyeceğini, aslında ölü kod olduğunu unutmayın. Fikir bu, sadece durumu yukarı kaldırmaya devam et. Bitirdikten sonra sınıf bileşenini kaldırabilirsiniz:
function Hello(props) {
const [count, setCount] = React.useState(0);
return <button onClick={() => setCount(count+1)}>{count}</button>;
}
ReactDOM.render(<Hello count={0}/>, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js" integrity="sha256-3vo65ZXn5pfsCfGM5H55X+SmwJHBlyNHPwRmWAPgJnM=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js" integrity="sha256-qVsF1ftL3vUq8RFOLwPnKimXOLo72xguDliIxeffHRc=" crossorigin="anonymous"></script>
<div id='root'></div>
Bu, sınıf bileşenlerinin içinde kancaların kullanılmasını mümkün kılarken, bu örnekte yaptığım gibi geçiş yapmadığınız sürece bunu yapmanızı tavsiye etmem. İşlev ve sınıf bileşenlerini karıştırmak, durum yönetimini bir karmaşa haline getirecektir. Umarım bu yardımcı olur
Saygılarımla
useState
uygulandığını anlamak için kaynak koduna da bakabilirsiniz . 16.9 sürümünden itibaren tanım burada .