模板速成网站,英文网站建设口碑好,网页的设计与制作,wordpress 已登录用户摘自阮一峰#xff1a;React入门实例教程#xff0c;转载请注明出处。 一、获取真实的DOM节点 组件并不是真实的 DOM 节点#xff0c;而是存在于内存之中的一种数据结构#xff0c;叫做虚拟 DOM #xff08;virtual DOM#xff09;。只有当它插入文档以后#xff0c;才会…摘自阮一峰React入门实例教程转载请注明出处。 一、获取真实的DOM节点 组件并不是真实的 DOM 节点而是存在于内存之中的一种数据结构叫做虚拟 DOM virtual DOM。只有当它插入文档以后才会变成真实的 DOM 。根据 React 的设计所有的 DOM 变动都先在虚拟 DOM 上发生然后再将实际发生变动的部分反映在真实 DOM上这种算法叫做 DOM diff 它可以极大提高网页的性能表现。 但是有时需要从组件获取真实 DOM 的节点这时就要用到 ref 属性。 var MyComponent React.createClass({handleClick: function() {this.refs.myTextInput.focus();},render: function() {return (divinput typetext refmyTextInput /input typebutton valueFocus the text input onClick{this.handleClick} //div);}
});ReactDOM.render(MyComponent /,document.getElementById(example)
); 上面代码中组件 MyComponent 的子节点有一个文本输入框用于获取用户的输入。这时就必须获取真实的 DOM 节点虚拟 DOM 是拿不到用户输入的。为了做到这一点文本输入框必须有一个 ref 属性然后 this.refs.[refName] 就会返回这个真实的 DOM 节点。 需要注意的是由于 this.refs.[refName] 属性获取的是真实 DOM 所以必须等到虚拟 DOM 插入文档以后才能使用这个属性否则会报错。上面代码中通过为组件指定 Click 事件的回调函数确保了只有等到真实 DOM 发生 Click 事件之后才会读取 this.refs.[refName] 属性。 React 组件支持很多事件除了 Click 事件以外还有 KeyDown 、Copy、Scroll 等完整的事件清单请查看官方文档。 二、this.state 组件状态 组件免不了要与用户互动React的一大创新就是将组件看成是一个状态机一开始有一个初始状态然后用户互动导致状态变化从而触发重新渲染 UI。 var LikeButton React.createClass({getInitialState: function() { //定义初始状态也就是一个对象return {liked: false};},handleClick: function(event) {this.setState({liked: !this.state.liked}); //通过this.state属性读取定义的状态//每次修改以后自动调用 this.render 方法再次渲染组件},render: function() {var text this.state.liked ? like : haven\t liked;return (p onClick{this.handleClick}You {text} this. Click to toggle./p);}});ReactDOM.render(LikeButton /,document.getElementById(example)
); 上面代码是一个 LikeButton 组件它的 getInitialState 方法用于定义初始状态也就是一个对象这个对象可以通过 this.state 属性读取。当用户点击组件导致状态变化this.setState 方法就修改状态值每次修改以后自动调用 this.render 方法再次渲染组件。 由于 this.props 和 this.state 都用于描述组件的特性可能会产生混淆。一个简单的区分方法是this.props 表示那些一旦定义就不再改变的特性而 this.state 是会随着用户互动而产生变化的特性。 三、表单 用户在表单填入的内容属于用户跟组件的互动所以不能用 this.props 读取。 var Input React.createClass({getInitialState: function() {return {value: Hello!};},handleChange: function(event) {this.setState({value: event.target.value});},render: function () {var value this.state.value;return (divinput typetext value{value} onChange{this.handleChange} /p{value}/p/div);}
});ReactDOM.render(Input/, document.body); 上面代码中文本输入框的值不能用 this.props.value 读取而要定义一个 onChange 事件的回调函数通过 event.target.value 读取用户输入的值。textarea 元素、select元素、radio元素都属于这种情况. 四、组件的生命周期 组件的生命周期分成三个状态 Mounting已插入真实 DOM
Updating正在被重新渲染
Unmounting已移出真实 DOM React 为每个状态都提供了两种处理函数will 函数在进入状态之前调用did 函数在进入状态之后调用三种状态共计五种处理函数。 componentWillMount()
componentDidMount()
componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
componentWillUnmount() 此外React 还提供两种特殊状态的处理函数。 componentWillReceiveProps(object nextProps)已加载组件收到新的参数时调用
shouldComponentUpdate(object nextProps, object nextState)组件判断是否重新渲染时调用 下面是一个例子。 var Hello React.createClass({getInitialState: function () {return {opacity: 1.0};},componentDidMount: function () {this.timer setInterval(function () {var opacity this.state.opacity;opacity - .05;if (opacity 0.1) {opacity 1.0;}this.setState({opacity: opacity});}.bind(this), 100);},render: function () {return (div style{{opacity: this.state.opacity}}Hello {this.props.name}/div);}
});ReactDOM.render(Hello nameworld/,document.body
); 上面代码在hello组件加载以后通过 componentDidMount方法设置一个定时器每隔100毫秒就重新设置组件的透明度从而引发重新渲染。 另外组件的style属性的设置方式也值得注意不能写成 styleopacity:{this.state.opacity}; 而要写成 style{{opacity: this.state.opacity}} 这是因为 React 组件样式是一个对象所以第一重大括号表示这是 JavaScript 语法第二重大括号表示样式对象。 五、Ajax 组件的数据来源通常是通过 Ajax 请求从服务器获取可以使用 componentDidMount 方法设置 Ajax 请求等到请求成功再用 this.setState 方法重新渲染 UI. var UserGist React.createClass({getInitialState: function() {return {username: ,lastGistUrl: };},componentDidMount: function() {$.get(this.props.source, function(result) {var lastGist result[0];if (this.isMounted()) {this.setState({username: lastGist.owner.login,lastGistUrl: lastGist.html_url});}}.bind(this));},render: function() {return (div{this.state.username}s last gist isa href{this.state.lastGistUrl}here/a./div);}
});ReactDOM.render(UserGist sourcehttps://api.github.com/users/octocat/gists /,document.body
); 上面代码使用 jQuery 完成 Ajax 请求这是为了便于说明。React 本身没有任何依赖完全可以不用jQuery而使用其他库。转载于:https://www.cnblogs.com/lishuxue/p/6121775.html