image.png
image.png

源码

  1. //生命周期脚本
  2. var HelloMassage = React.createClass({
  3. //设置默认属性
  4. getDefaultProps: function() {
  5. console.log("初始化默认的属性");
  6. return {
  7. name: "test"
  8. }
  9. },
  10. //设置默认状态
  11. getInitialState: function() {
  12. console.log("初始化状态成功");
  13. return {
  14. isLoading: false
  15. }
  16. },
  17. //组件被挂载之前,Render 之前最后一次修改状态的机会
  18. componentWillMount: function() {
  19. //修改状态
  20. this.setState({
  21. isLoading: true
  22. });
  23. console.log("组件被挂载之前");
  24. },
  25. //组件被渲染之后
  26. componentDidMount: function() {
  27. console.log("组件被真实的渲染到页面中完成");
  28. // console.log(this.refs);
  29. // console.log(this.refs.uname);
  30. //获取 jquery dom
  31. // console.log($(this.refs.uname));
  32. //获取 value
  33. // console.log($(this.refs.uname).val());
  34. //修改 css
  35. // $(this.refs.uname).css({
  36. // "color": "red"
  37. // });
  38. //自动完成(Autocomplete) 单词补充的示例
  39. // var availableTags = [
  40. // "ActionScript",
  41. // "AppleScript",
  42. // "Asp",
  43. // "BASIC",
  44. // "C",
  45. // "C++",
  46. // "Clojure",
  47. // "COBOL",
  48. // "ColdFusion",
  49. // "Erlang",
  50. // "Fortran",
  51. // "Groovy",
  52. // "Haskell",
  53. // "Java",
  54. // "JavaScript",
  55. // "Lisp",
  56. // "Perl",
  57. // "PHP",
  58. // "Python",
  59. // "Ruby",
  60. // "Scala",
  61. // "Scheme"
  62. // ];
  63. // $(this.refs.uname).autocomplete({
  64. // source: availableTags
  65. // });
  66. //获取 ReactDOM 这个获取到的是一个纯粹的 DOM 节点
  67. console.log(ReactDOM.findDOMNode(this.refs.uname));
  68. },
  69. //不能修改属性和状态
  70. componentWillUpdate: function(data) {
  71. console.log("componentWillUpdate", data);
  72. },
  73. //可以修改 DOM
  74. componentDidUpdate: function(data) {
  75. console.log("componentDidUpdate", data);
  76. },
  77. //返回 false 会阻止 render 调用
  78. shouldComponentUpdate: function(nextrops) {
  79. console.log("shouldComponentUpdate", nextrops);
  80. //返回一个 boolean 值
  81. // return false;//false 的话页面就不会更新
  82. return true;
  83. },
  84. //父组件修改属性触发,可以修改新属性和方法
  85. componentWillReceiveProps: function(nextrops) {
  86. console.log("componentWillReceiveProps", nextrops);
  87. },
  88. //销毁阶段 默认是不会触发的需要 给 dom 绑定事件
  89. componentWillUnmount: function() {
  90. console.log("已经删除了");
  91. },
  92. _change: function(e) {
  93. // console.log(e);
  94. // console.log(e.target);
  95. // console.log(e.target.value);
  96. //判断改变的内容
  97. if (e.target.value == "123") {
  98. //移除 React 创建的 DOM 节点
  99. //需要注意的是这里移除的控件一定得是最终创建时的那个 dom 不然是不会成功的
  100. // ReactDOM.unmountComponentAtNode(document.getElementById("xx"));//会报错 因为传的阶段不是当初创建时所用的
  101. ReactDOM.unmountComponentAtNode(document.getElementById("example"));
  102. }
  103. },
  104. render: function() {
  105. console.log("render 页面");
  106. return (
  107. <div>
  108. {/*这里可以获取到父组件传递过来的 name 属性的值*/}
  109. <label htmlFor="uname">{this.props.name}</label>
  110. {/*<input ref="uname" value={this.props.name} onChange={this._change} type="text"/>*/}
  111. <input id="uname" ref="uname" onChange={this._change} type="text"/>
  112. <h1>{this.props.name}</h1>
  113. {!this.state.isLoading ? <h1>loading...</h1> : <h1>ok</h1>}
  114. </div>
  115. )
  116. }
  117. });
  118. //新建一个父组件
  119. var HelloWorld = React.createClass({
  120. getInitialState: function() {
  121. return {
  122. data: "父容器的状态"
  123. }
  124. },
  125. click: function() {
  126. this.setState({
  127. data: "被改变"
  128. })
  129. },
  130. render: function() {
  131. return (
  132. <form onClick={this.click} id="xx">
  133. {/*使用父组件标签包裹着子组件 这样就可以通过父组件来给子组件传递一些属性了
  134. */}
  135. <HelloMassage name={this.state.data} />
  136. </form>
  137. )
  138. }
  139. });
  140. ReactDOM.render(
  141. <HelloWorld name="我是父组件" />,
  142. document.getElementById("example")
  143. );

React 生命周期总结:

image.png

  1. componentWillUnmount

清理操作,也就是销毁阶段,它可以在我们卸载组件的时候处理一些代码中的逻辑、操作和其他的一些脏东西

  1. componentDidMount

获取真实的 DOM 节点,这个是在组件被渲染之后才会执行的操作

  1. componentWillReceiveProps

通过父组件控制子组件,这个是说在父组件修改属性触发,可以修改新属性和方法

  1. shouldComponentUpdate

动态设置更新增强性能,返回 false 会阻止 render 调用

  1. render 最重要的点

控制 state ,在整个的组件中到处都在执行 render ,所以 render 的性能是必须要把控好的