±à¼ÍƼö: |
ÎÄÕ½éÉÜÁËReact
ÊÇÈçºÎ´¦ÀíʼþµÄ£¬ËÄÖÖʼþ´¦ÀíµÄÓÅȱµã¶Ô±È£¬React ·Ç³£ÖØÒªµÄÒ»¸ö·½·¨setStateµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚtaoweng.site£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
ΪʲôҪÒýÈë React
import React
from 'react'
function A() {
// ...other code
return <h1>ǰ¶ËÌÒÔ°</h1>
} |
Äã¿Ï¶¨ÒÉ»ó¹ý£¬ÏÂÃæµÄ´úÂ붼ûÓÐÓõ½ React£¬ÎªÊ²Ã´ÒªÒýÈë React ÄØ£¿
Èç¹ûÄã°Ñ import React from ¡®react¡¯ ɾµô£¬»¹»á±¨ÏÂÃæÕâÑùµÄ´íÎó£º

ÄÇô¾¿¾¹ÊÇÄÄÀïÓõ½ÁËÕâ¸ö React£¬µ¼ÖÂÎÒÃÇÒýÈë React »á±¨´íÄØ£¬²»¶®Õâ¸öÔÒò£¬ÄÇô¾ÍÊÇ JSX
ûÓиãµÃÌ«Ã÷°×¡£
Äã¿ÉÒÔ½²ÉÏÃæµÄ´úÂë(ºöÂÔµ¼ÈëÓï¾ä)·Åµ½ÔÚÏß babel Àï½øÐÐת»¯Ò»Ï£¬·¢ÏÖ
babel »á°ÑÉÏÃæµÄ´úÂëת»¯³É:
function A()
{
// ...other code
return React.createElement("h1", null,
"ǰ¶ËÌÒÔ°");
} |
ÒòΪ´Ó±¾ÖÊÉϽ²£¬JSX Ö»ÊÇΪ React.createElement(component, props,
...children) º¯ÊýÌṩµÄÓï·¨ÌÇ¡£
ΪʲôҪÓà className ¶ø²»Óà class
React Ò»¿ªÊ¼µÄÀíÄîÊÇÏëÓëä¯ÀÀÆ÷µÄ DOM API ±£³ÖÒ»Ö±¶ø²»ÊÇ
HTML£¬ÒòΪ JSX ÊÇ JS µÄÀ©Õ¹£¬¶ø²»ÊÇÓÃÀ´´úÌæ HTML µÄ£¬ÕâÑù»áºÍÔªËØµÄ´´½¨¸üΪ½Ó½ü¡£ÔÚÔªËØÉÏÉèÖÃ
class ÐèҪʹÓà className Õâ¸ö API£º
const element
= document.createElement("div")
element.className = "hello" |
ä¯ÀÀÆ÷ÎÊÌ⣬ES5 ֮ǰ£¬ÔÚ¶ÔÏóÖв»ÄÜʹÓñ£Áô×Ö¡£ÒÔÏ´úÂëÔÚ IE8
Öн«»áÅ׳ö´íÎó£º
const element
= {
attributes: {
class: "hello"
}
} |
½â¹¹ÎÊÌ⣬µ±ÄãÔڽ⹹ÊôÐÔµÄʱºò£¬Èç¹û·ÖÅäÒ»¸ö class ±äÁ¿»á³öÎÊÌ⣺
const { class
} = { class: 'foo' } // Uncaught SyntaxError:
Unexpected token }
const { className } = { className: 'foo' }
const { class: className } = { class: 'foo' }
|
ÆäËûÌÖÂۿɼû£ºÓÐȤµÄ»°Ì⣬ΪʲôjsxÓÃclassName¶ø²»ÊÇclass
ΪʲôÊôÐÔÒªÓÃСÍÕ·å
ÒòΪ JSX Óï·¨Éϸü½Ó½ü JavaScript ¶ø²»ÊÇ HTML£¬ËùÒÔ React DOM ʹÓÃ
camelCase£¨Ð¡ÍÕ·åÃüÃû£©À´¶¨ÒåÊôÐÔµÄÃû³Æ£¬¶ø²»Ê¹Óà HTML ÊôÐÔÃû³ÆµÄÃüÃûÔ¼¶¨¡£
À´×Ô JSX ¼ò½é
Ϊʲô constructor ÀïÒªµ÷Óà super ºÍ´«µÝ props
ÕâÊǹÙÍøµÄÒ»¶Î´úÂ룬¾ßÌå¼û£º×´Ì¬(State) ºÍ ÉúÃüÖÜÆÚ
class Clock
extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
} |
¶øÇÒÓÐÕâôһ¶Î»°£¬²»½öÈÃÎÒÃǵ÷Óà super »¹Òª°Ñ props ´«µÝ½øÈ¥£¬µ«ÊÇûÓиæËßÎÒÃÇΪʲôҪÕâô×ö¡£

²»ÖªµÀÄãÓÐûÓÐÒÉ»ó¹ýΪʲôҪµ÷Óà super ºÍ´«µÝ props£¬½ÓÏÂÀ´ÎÒÃÇÀ´½â¿ªÃÕÌâ°É¡£
ΪʲôҪµ÷Óà super
ÆäʵÕâ²»ÊÇ React µÄÏÞÖÆ£¬ÕâÊÇ JavaScript µÄÏÞÖÆ£¬ÔÚ¹¹Ô캯ÊýÀïÈç¹ûÒªµ÷Óà this£¬ÄÇôÌáǰ¾ÍÒªµ÷ÓÃ
super£¬ÔÚ React ÀÎÒÃdz£³£»áÔÚ¹¹Ô캯ÊýÀï³õʼ»¯ state£¬this.state =
xxx £¬ËùÒÔÐèÒªµ÷Óà super¡£
ΪʲôҪ´«µÝ props
Äã¿ÉÄÜÒÔΪ±ØÐë¸ø super ´«Èë props£¬·ñÔò React.Component
¾Íû·¨³õʼ»¯ this.props£º
class Component
{
constructor(props) {
this.props = props;
// ...
}
} |
²»¹ý£¬Èç¹ûÄ㲻СÐÄ©´«ÁË props£¬Ö±½Óµ÷ÓÃÁË super()£¬ÄãÈÔÈ»¿ÉÒÔÔÚ render ºÍÆäËû·½·¨ÖзÃÎÊ
this.props£¨²»Ðŵϰ¿ÉÒÔÊÔÊÔÂ¡£
ΪɶÕâÑùÒ²ÐУ¿ÒòΪReact »áÔÚ¹¹Ô캯Êý±»µ÷ÓÃÖ®ºó£¬»á°Ñ props
¸³Öµ¸ø¸Õ¸Õ´´½¨µÄʵÀý¶ÔÏó£º
const instance
= new YourComponent(props);
instance.props = props; |
props ²»´«Ò²ÄÜÓã¬ÊÇÓÐÔÒòµÄ¡£
µ«ÕâÒâζ×ÅÄãÔÚʹÓà React ʱ£¬¿ÉÒÔÓà super() ´úÌæ super(props) ÁËô£¿
ÄÇ»¹ÊDz»Ðе쬲»È»¹ÙÍøÒ²²»»á½¨ÒéÄãµ÷Óà props ÁË£¬ËäÈ» React
»áÔÚ¹¹Ô캯ÊýÔËÐÐÖ®ºó£¬Îª this.props ¸³Öµ£¬µ«ÔÚ super() µ÷ÓÃÖ®ºóÓë¹¹Ô캯Êý½áÊøÖ®Ç°£¬
this.props ÈÔÈ»ÊÇû·¨Óõġ£
// Inside React
class Component {
constructor(props) {
this.props = props;
// ...
}
}
// Inside your code
class Button extends React.Component {
constructor(props) {
super(); // ?? ÍüÁË´«Èë props
console.log(props); // ? {}
console.log(this.props); // ?? undefined
}
// ...
} |
ÒªÊǹ¹Ô캯ÊýÖе÷ÓÃÁËij¸ö·ÃÎÊ props µÄ·½·¨£¬ÄÇÕâ¸ö bug
¾Í¸üÄѶ¨Î»ÁË¡£Òò´ËÎÒÇ¿ÁÒ½¨ÒéʼÖÕʹÓÃsuper(props)£¬¼´Ê¹Õâ²»ÊDZØÐëµÄ£º
class Button
extends React.Component {
constructor(props) {
super(props); // ? We passed props
console.log(props); // ? {}
console.log(this.props); // ? {}
}
// ...
} |
ÉÏÃæµÄ´úÂëÈ·±£ this.props ʼÖÕÊÇÓÐÖµµÄ¡£
Èç¹ûÄãÏë±ÜÃâÒÔÉϵÄÎÊÌ⣬Äã¿ÉÒÔͨ¹ýclass ÊôÐÔÌá°¸ À´¼ò»¯´úÂ룺
class Clock
extends React.Component {
state = {date: new Date()};
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
} |
¸üÏêϸµÄÄÚÈݿɼûDan µÄ²©¿Í
Ϊʲô×é¼þÓôóд¿ªÍ·
Ç°ÃæÒÔ¼°Ëµ¹ýÁË£¬JSX ÊÇ React.createElement(component, props,
¡children) ÌṩµÄÓï·¨ÌÇ£¬component µÄÀàÐÍÊÇ£ºstring/ReactClass
type£¬ÎÒÃǾßÌå¿´Ò»ÏÂÔÚʲôÇé¿öÏ»áÓõ½ string ÀàÐÍ£¬Ê²Ã´Çé¿öÏÂÓõ½ ReactClass
type ÀàÐÍ
string ÀàÐÍreact»á¾õµÃËûÊÇÒ»¸öÔÉúdom½Úµã
ReactClass type ÀàÐÍ ×Ô¶¨Òå×é¼þ
ÀýÈ磨string£©£ºÔÚ jsx ÖÐÎÒÃÇдһ¸ö
ת»»ÎªjsµÄʱºò¾Í±ä³ÉÁË
React.createElement("div",
null) |
ÀýÈ磨ReactClass type£©£ºÔÚjsxÖÐÎÒÃÇдһ¸ö
function MyDiv()
{
return (<div><div>)
}
<MyDiv></MyDiv> |
ת»»ÎªjsµÄʱºò¾Í±ä³ÉÁË
function MyDiv()
{
return React.createElement("div", null);
}
React.createElement(MyDiv, null); |
ÉϱߵÄÀý×ÓÖÐÈç¹û½«MyDivÖеÄÊ××ÖĸСд£¬ÈçÏÂ
function myDiv()
{
return (<div><div>)
}
<myDiv></myDiv> |
ת»»Îª js µÄʱºò¾Í±ä³ÉÁË
function MyDiv()
{
return React.createElement("div", null);
}
React.createElement("myDiv", null); |
ÓÉÓÚÕÒ²»µ½ myDiv Õâ¸ö dom£¬ËùÒԾͻᱨ´í¡£
Ϊʲôµ÷Ó÷½·¨Òª bind this
ǰÌá֪ʶ£ºÉî¿ÌµÄÀí½â JavaScript ÖÐµÄ this
ÏàПÕд React µÄʱºò£¬ºÜ¶àÅóÓÑ¿ÉÄÜ»áдÀàËÆÕâÑùµÄ´úÂ룺
class Foo extends
React.Component {
handleClick () {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
)
}
} |
·¢Ïֻᱨ this ÊÇ undefined µÄ´í£¬È»ºó¿ÉÄܶÔʼþ´¦Àí±È½ÏÒÉ»ó£¬È»ºóÈ¥¿´¹ÙÍøµÄʼþ´¦ÀíÓÐÏÂÃæÒ»¶Î»°£º
Äã±ØÐë½÷É÷¶Ô´ý JSX »Øµ÷º¯ÊýÖÐµÄ this£¬ÔÚ JavaScript ÖУ¬class µÄ·½·¨Ä¬Èϲ»»á°ó¶¨this¡£Èç¹ûÄãÍü¼Ç°ó¶¨
this.handleClick ²¢°ÑËü´«ÈëÁË onClick£¬µ±Äãµ÷ÓÃÕâ¸öº¯ÊýµÄʱºò this µÄֵΪ
undefined¡£
Õâ²¢²»ÊÇ React ÌØÓеÄÐÐΪ£»ÕâÆäʵÓë JavaScript º¯Êý¹¤×÷ÔÀíÓйء£Í¨³£Çé¿öÏ£¬Èç¹ûÄãûÓÐÔÚ·½·¨ºóÃæÌí¼Ó
()£¬ÀýÈç onClick={this.handleClick}£¬ÄãÓ¦¸ÃΪÕâ¸ö·½·¨°ó¶¨ this¡£
È»ºóÄã¿´Á˹ÙÍøµÄÀý×Ӻͽ¨ÒéÖ®ºó£¬ÖªµÀÐèҪΪʼþ´¦Àíº¯Êý°ó¶¨ this¾ÍÄܽâ¾ö£¬ÏëÏÂÃæÕâÑù£º
class Foo extends
React.Component {
handleClick () {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={this.handleClick.bind(this)}>
Click me
</button>
)
}
} |
µ«ÊÇ¿ÉÄÜÄãûÓÐȥ˼¿¼¹ýΪʲôÐèÒª bind this£¿Èç¹ûÄã²»ÄÜÀí½âµÄ»°£¬»¹ÊÇ js µÄ»ù´¡Ã»ÓдòºÃ¡£
React ÊÇÈçºÎ´¦ÀíʼþµÄ£¿
ÔÛÃÇÏÈÀ´Á˽âһϠReact ÊÇÈçºÎ´¦ÀíʼþµÄ¡£
React µÄʼþÊǺϳÉʼþ£¬ ÄÚ²¿ÔÀí·Ç³£¸´ÔÓ£¬ÎÒÕâÀïÖ»°Ñ¹Ø¼üÐÔ£¬¿ÉÒÔÓÃÀ´½â´ðÕâ¸öÎÊÌâµÄÔÀí²¿·Ö½øÐнéÉܼ´¿É(ºóÃæÓ¦¸Ã»áдһƪ
react µÄʼþÔÀí£¬¾´ÇëÆÚ´ý)¡£
ÉÏÆªÎÄÕÂÒѾ˵¹ý£¬jsx ʵ¼ÊÉÏÊÇ React.createElement(component,
props, ¡children) º¯ÊýÌṩµÄÓï·¨ÌÇ£¬ÄÇôÕâ¶Î jsx ´úÂ룺
<button onClick={this.handleClick}>
Click me </button> |
»á±»×ª»¯Îª£º
React.createElement("button",
{
onClick: this.handleClick
}, "Click me") |
Á˽âÁËÉÏÃæµÄ£¬È»ºó¼òµ¥µÄÀí½â react ÈçºÎ´¦ÀíʼþµÄ£¬React ÔÚ×é¼þ¼ÓÔØ(mount)ºÍ¸üÐÂ(update)ʱ£¬½«Ê¼þͨ¹ý
addEventListener ͳһע²áµ½ document ÉÏ£¬È»ºó»áÓÐÒ»¸öʼþ³Ø´æ´¢ÁËËùÓеÄʼþ£¬µ±Ê¼þ´¥·¢µÄʱºò£¬Í¨¹ý
dispatchEvent ½øÐÐʼþ·Ö·¢¡£
ËùÒÔÄã¿ÉÒÔ¼òµ¥µÄÀí½âΪ£¬×îÖÕ this.handleClick »á×÷Ϊһ¸ö»Øµ÷º¯Êýµ÷Óá£
Àí½âÁËÕâ¸ö£¬È»ºóÔÙÀ´¿´¿´»Øµ÷º¯ÊýΪʲô¾Í»á¶ªÊ§ this¡£
this ¼òµ¥»Ø¹Ë
ÔÚº¯ÊýÄÚ²¿£¬thisµÄֵȡ¾öÓÚº¯Êý±»µ÷Óõķ½Ê½¡£
Èç¹ûÄã²»ÄÜÀí½âÉÏÃæÄǾ仰£¬ÄÇôÄã¿ÉÄÜÐèҪͣÏÂÀ´ÔĶÁÎÄÕ£¬È¥²éÒ»ÏÂÏà¹Ø×ÊÁÏ£¬·ñÔòÄã¿ÉÄÜ¿´²»¶®ÏÂÃæµÄ£¬Èç¹ûÄãÀÁµÄ»°£¬¾Í¿´ÎªÄã×¼±¸ºÃµÄ
MDN °É¡£
ͨ¹ýÉÏÃæ¶Ôʼþ´¦ÀíµÄ½éÉÜ£¬À´Ä£ÄâÒ»ÏÂÔÚÀà×é¼þµÄ render º¯ÊýÖУ¬
ÓеãÀàËÆÓÚ×öÁËÕâÑùµÄ²Ù×÷:
class Foo {
sayThis () {
console.log(this); // ÕâÀïµÄ `this` Ö¸ÏòË£¿
}
exec (cb) {
cb();
}
render () {
this.exec(this.sayThis);
}
}
var foo = new Foo();
foo.render(); // Êä³ö½á¹ûÊÇʲô£¿ |
Äã»á·¢ÏÖ×îÖÕ½á¹ûÊä³öµÄÊÇ undefined£¬Èç¹ûÄã²»Àí½âΪʲôÊä³öµÄÊÇ undefined£¬ÄÇô»¹ÊÇÉÏÃæËµµÄ£¬ÐèҪȥÉî¿ÌµÄÀí½â
this µÄÔÀí¡£Èç¹ûÄãÄÜÀí½âÊä³öµÄÊÇ undefined£¬ÄÇôÎÒ¾õµÃÄã¾Í¿ÉÒÔÀí½âΪʲôÐèÒª bind
this ÁË¡£
ÄÇôÄã¿ÉÄÜ»áÎÊ£ºÎªÊ²Ã´ReactûÓÐ×Ô¶¯µÄ°Ñ bind ¼¯³Éµ½ render
·½·¨ÖÐÄØ?ÔÚ exec µ÷Óûص÷µÄʱºò°ó¶¨½øÈ¥£¬ÏñÕâÑù£º
class Foo {
sayThis () {
console.log(this); // ÕâÀïµÄ `this` Ö¸ÏòË£¿
}
exec (cb) {
cb().bind(this);
}
render () {
this.exec(this.sayThis);
}
}
var foo = new Foo();
foo.render(); // Êä³ö½á¹ûÊÇʲô£¿ |
ÒòΪ render ¶à´Îµ÷ÓÃÿ´Î¶¼Òª bind »áÓ°ÏìÐÔÄÜ£¬ËùÒÔ¹Ù·½½¨ÒéÄã×Ô¼ºÔÚ constructor
ÖÐÊÖ¶¯ bind ´ïµ½ÐÔÄÜÓÅ»¯¡£
ËÄÖÖʼþ´¦Àí¶Ô±È
¶ÔÓÚʼþ´¦ÀíµÄд·¨Ò²Óкü¸ÖÖ£¬ÔÛÃÇÀ´½øÐжԱÈһϣº
1. Ö±½Ó bind this ÐÍ
¾ÍÊÇÏñÎÄÕ¿ªÊ¼µÄÄÇÑù£¬Ö±½ÓÔÚʼþÄÇÀï bind this
class Foo extends
React.Component {
handleClick () {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={this.handleClick.bind(this)}>
Click me
</button>
)
}
} |
Óŵ㣺дÆðÀ´Ë³ÊÖ£¬Ò»¿ÚÆø¾ÍÄܰÑÕâ¸öÂ߼дÍ꣬²»ÓÃÒÆ¶¯¹â±êµ½ÆäËûµØ·½¡£
ȱµã£ºÐÔÄܲ»Ì«ºÃ£¬ÕâÖÖ·½Ê½¸ú react ÄÚ²¿°ïÄã bind Ò»ÑùµÄ£¬Ã¿´Î render ¶¼»á½øÐÐ
bind£¬¶øÇÒÈç¹ûÓÐÁ½¸öÔªËØµÄʼþ´¦Àíº¯Êýʽͬһ¸ö£¬Ò²»¹ÊÇÒª½øÐÐ bind£¬ÕâÑù»á¶àдµã´úÂ룬¶øÇÒ½øÐÐÁ½´Î
bind£¬ÐÔÄܲ»ÊÇÌ«ºÃ¡£(ÆäʵÕâµãÐÔÄÜÍùÍù²»»áÊÇÐÔÄÜÆ¿¾±µÄµØ·½£¬Èç¹ûÄã¾õµÃ˳ÊÖ£¬ÕâÑùдÍêȫûÎÊÌâ)
2. constuctor ÊÖ¶¯ bind ÐÍ
class Foo extends
React.Component {
handleClick = () => {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
)
}
} |
Óŵ㣺Ïà±ÈÓÚµÚÒ»ÖÖÐÔÄܸüºÃ£¬ÒòΪ¹¹Ô캯ÊýÖ»Ö´ÐÐÒ»´Î£¬ÄÇôֻ»á bind Ò»´Î£¬¶øÇÒÈç¹ûÓжà¸öÔªËØ¶¼ÐèÒªµ÷ÓÃÕâ¸öº¯Êý£¬Ò²²»ÐèÒªÖØ¸´
bind£¬»ù±¾ÉϽâ¾öÁ˵ÚÒ»ÖÖµÄÁ½¸öȱµã¡£
ȱµã£ºÃ»ÓÐÃ÷ÏÔȱµã£¬Ó²ÒªËµµÄ»°¾ÍÊÇÌ«³óÁË£¬È»ºó²»Ë³ÊÖ(ÎÒ¾õµÃ³ó£¬Äã¾õµÃ²»³ó¾ÍÕâôд¾ÍÐÐÁË)¡£
3. ¼ýÍ·º¯ÊýÐÍ
class Foo extends
React.Component {
handleClick () {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={(e) => this.handleClick(e)}>
Click me
</button>
)
}
} |
Óŵ㣺˳ÊÖ£¬ºÃ¿´¡£
ȱµã£ºÃ¿´Î render ¶¼»áÖØ¸´´´½¨º¯Êý£¬ÐÔÄÜ»á²îÒ»µã¡£
4. public class fields ÐÍ
ÕâÖÖ class fields»¹´¦ÓÚʵÑé½×¶Î£¬¾ÝÎÒËù֪Ŀǰ»¹Ã»Óб»ÄÉÈë±ê×¼£¬¾ßÌå¿É¼ûÕâÀï¡£
class Foo extends
React.Component {
handleClick = () => {
this.setState({ xxx: aaa })
}
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
)
}
} |
Óŵ㣺ºÃ¿´£¬ÐÔÄܺá£
ȱµã£ºÃ»ÓÐÃ÷ÏÔȱµã£¬Èç¹ûӲҪ˵¿ÉÄܾÍÊÇÒª¶à×°Ò»¸ö babel ²å¼þÀ´Ö§³ÖÕâÖÖÓï·¨¡£
×ܽá
ÎÒÆ½Ê±ÓõľÍÕâËÄÖÖд·¨£¬ÎÒÕâ±ß´Ó´úÂëµÄÃÀ¹ÛÐÔ¡¢ÐÔÄÜÒÔ¼°ÊÇ·ñ˳ÊÖ·½±ã¶Ô¸÷ÖÖд·¨×öÁ˼òµ¥µÄ¶Ô±È¡£ÆäʵÿÖÖ·½·¨ÔÚÏîÄ¿ÀïÓö¼ÊÇûʲôÎÊÌâµÄ£¬ÐÔÄÜ·½Ãæ»ù±¾ÉÏ¿ÉÒÔºöÂÔ£¬¶ÔÓÚÃÀ¹ÛÐÔºÍ˳ÊֱȽÏÖ÷¹Û£¬ËùÒÔ×ÜÌåÀ´Ëµ¾ÍÊÇ¿´´ó¼ÒµÄÆ«ºÃ¿©£¬Èç¹ûÓ²ÒªÍÆ¼öµÄ»°£¬ÎÒ»¹ÊDZȽÏÍÆ¼öµÚËÄÖÖд·¨£¬ÃÀ¹Û¶øÇÒ²»Ó°ÏìÐÔÄÜ¡£
ΪʲôҪ setState£¬¶ø²»ÊÇÖ±½Ó this.state.xx = oo
Õâ¸öÎÊÌâÊÇÎÒÃǹ«Ë¾ºó¶Ëд React µÄʱºòÌá³öµÄÎÊÌ⣬Ϊɶ²»ÄÜÖ±½ÓÐÞ¸Ä state£¬Òª setState
һϡ£ÎÒÔÚÏ룬´Ó vue תµ½ React ¿ÉÄÜÒ²»áÓÐÕâÖÖÒÉÎÊ£¬ÒòΪ vue ÐÞ¸Ä״̬¶¼ÊÇÖ±½Ó¸ÄµÄ¡£
Èç¹ûÎÒÃÇÁ˽â setState µÄÔÀíµÄ»°£¬¿ÉÄܾÍÄܽâ´ðÕâ¸öÎÊÌâÁË£¬setState ×öµÄÊÂÇé²»½ö½öÖ»ÊÇÐÞ¸ÄÁË
this.state µÄÖµ£¬ÁíÍâ×îÖØÒªµÄÊÇËü»á´¥·¢ React µÄ¸üлúÖÆ£¬»á½øÐÐ diff £¬È»ºó½«
patch ²¿·Ö¸üе½ÕæÊµ dom Àï¡£
Èç¹ûÄãÖ±½Ó this.state.xx == oo µÄ»°£¬state µÄֵȷʵ»á¸Ä£¬µ«ÊǸÄÁ˲»»á´¥·¢
UI µÄ¸üУ¬ÄǾͲ»ÊÇÊý¾ÝÇý¶¯ÁË¡£
ÄÇΪʲô Vue Ö±½ÓÐÞ¸Ä data ¿ÉÒÔ´¥·¢ UI µÄ¸üÐÂÄØ£¿ÒòΪ
Vue ÔÚ´´½¨ UI µÄʱºò»á°ÑÕâЩ data ¸øÊÕ¼¯ÆðÀ´£¬²¢ÇÒÔÚÕâЩ data µÄ·ÃÎÊÆ÷ÊôÐÔ setter
½øÐÐÁËÖØÐ´£¬ÔÚÕâ¸öÖØÐ´µÄ·½·¨Àï»áÈ¥´¥·¢ UI µÄ¸üС£
setState ÊÇͬ²½»¹ÊÇÒì²½Ïà¹ØÎÊÌâ
1. setState ÊÇͬ²½»¹ÊÇÒì²½£¿
ÎҵĻشðÊÇÖ´Ðйý³Ì´úÂëͬ²½µÄ£¬Ö»ÊǺϳÉʼþºÍ¹³×Óº¯ÊýµÄµ÷ÓÃ˳ÐòÔÚ¸üÐÂ֮ǰ£¬µ¼ÖÂÔںϳÉʼþºÍ¹³×Óº¯ÊýÖÐû·¨Á¢ÂíÄõ½¸üкóµÄÖµ£¬ÐÎʽÁËËùνµÄ¡°Òì²½¡±£¬ËùÒÔ±íÏÖ³öÀ´ÓÐʱÊÇͬ²½£¬ÓÐʱÊÇ¡°Òì²½¡±¡£
2. ºÎʱÊÇͬ²½£¬ºÎʱÊÇÒì²½ÄØ£¿
Ö»ÔںϳÉʼþºÍ¹³×Óº¯ÊýÖÐÊÇ¡°Òì²½¡±µÄ£¬ÔÚÔÉúʼþºÍ setTimeout/setIntervalµÈÔÉú
API Öж¼ÊÇͬ²½µÄ¡£¼òµ¥µÄ¿ÉÒÔÀí½âΪ±» React ¿ØÖƵĺ¯ÊýÀïÃæ¾Í»á±íÏÖ³ö¡°Òì²½¡±£¬·´Ö®±íÏÖΪͬ²½¡£
3. ÄÇΪʲô»á³öÏÖÒì²½µÄÇé¿öÄØ£¿
ΪÁË×öÐÔÄÜÓÅ»¯£¬½« state µÄ¸üÐÂÑÓ»ºµ½×îºóÅúÁ¿ºÏ²¢ÔÙÈ¥äÖȾ¶ÔÓÚÓ¦ÓõÄÐÔÄÜÓÅ»¯ÊÇÓм«´óºÃ´¦µÄ£¬Èç¹ûÿ´ÎµÄ״̬¸Ä±ä¶¼È¥ÖØÐÂäÖÈ¾ÕæÊµ
dom£¬ÄÇôËü½«´øÀ´¾Þ´óµÄÐÔÄÜÏûºÄ¡£
4. ÄÇÈçºÎÔÚ±íÏÖ³öÒì²½µÄº¯ÊýÀï¿ÉÒÔ׼ȷÄõ½¸üкóµÄ state ÄØ£¿
ͨ¹ýµÚ¶þ¸ö²ÎÊý setState(partialState, callback) ÖÐµÄ callback
Äõ½¸üкóµÄ½á¹û¡£
»òÕß¿ÉÒÔͨ¹ý¸ø setState ´«µÝº¯ÊýÀ´±íÏÖ³öͬ²½µÄÇé¿ö£º
this.setState((state)
=> {
return { val: newVal }
}) |
5. ÄDZíÏÖ³öÒì²½µÄÔÀíÊÇÔõôÑùµÄÄØ£¿¡£
ÎÒÕâÀﻹÊÇÓÃ×î¼òµ¥µÄÓïÑÔÈÃÄãÀí½â£ºÔÚ React µÄ setState º¯ÊýʵÏÖÖУ¬»á¸ù¾Ý isBatchingUpdates(ĬÈÏÊÇ
false) ±äÁ¿ÅжÏÊÇ·ñÖ±½Ó¸üРthis.state »¹ÊǷŵ½¶ÓÁÐÖÐÉÔºó¸üС£È»ºóÓÐÒ»¸ö batchedUpdate
º¯Êý£¬¿ÉÒÔÐÞ¸Ä isBatchingUpdates Ϊ true£¬µ± React µ÷ÓÃʼþ´¦Àíº¯Êý֮ǰ£¬»òÕßÉúÃüÖÜÆÚº¯Êý֮ǰ¾Í»áµ÷ÓÃ
batchedUpdate º¯Êý£¬ÕâÑùµÄ»°£¬setState ¾Í²»»áͬ²½¸üРthis.state£¬¶øÊǷŵ½¸üжÓÁÐÀïÃæºóÐø¸üС£
ÕâÑùÄã¾Í¿ÉÒÔÀí½âΪʲôÔÉúʼþºÍ setTimeout/setinterval ÀïÃæµ÷Óà this.state
»áͬ²½¸üÐÂÁ˰ɣ¬ÒòΪͨ¹ýÕâЩº¯Êýµ÷ÓÃµÄ React û°ì·¨È¥µ÷Óà batchedUpdate º¯Êý½«
isBatchingUpdates ÉèÖÃΪ true£¬ÄÇôÕâ¸öʱºò setState µÄʱºòĬÈϾÍÊÇ
false£¬ÄÇô¾Í»áͬ²½¸üС£
×îºó
setState ÊÇ React ·Ç³£ÖØÒªµÄÒ»¸ö·½·¨£¬ÖµµÃ´ó¼ÒºÃºÃÈ¥Ñо¿Ò»ÏÂËûµÄÔÀí¡£
|