React.js再探(四)

不知道看官们还记不记得上一节的内容,关于生命周期的。我们来个例子重温且练习一下。

传送门:http://www.cnblogs.com/galenyip/p/4574400.html

 

我们来实现一下时钟的功能,要求当秒是“0”的时候,字体变为红色。注意用componentWillUpdate实现。

React.js再探(四)       当秒是0   变为React.js再探(四)

 1 <!DOCTYPE html>

 2 <html>

 3 <head>

 4     <meta charset="utf-8">

 5     <title>EzDigiClockComp</title>

 6     <script src="lib/react.min.js"></script>

 7     <script src="lib/JSXTransformer.js"></script>

 8     <!--组件样式-->

 9     <style>

10         @font-face {

11             font-family:"LED";

12             src:url("font/LED.eot?") format("eot"),

13                 url("font/LED.woff") format("woff"),

14                 url("font/LED.ttf") format("truetype"),

15                 url("font/LED.svg#LED") format("svg");

16             font-weight:normal;

17             font-style:normal;

18         }

19         .ez-digi-clock{

20             font-family : LED;

21             font-size : 40px;

22             background : #70d355;

23             width: 300px;

24             height:60px;

25             line-height : 60px;

26             text-align : right;

27             padding : 10px;

28             letter-spacing : 5px;

29         }    

30     </style>

31 </head>

32 <body>

33     <div id="content"></div>

34     <script type="text/jsx">

35         //获取并格式化当前时间

36         var _getTime =  function(){

37             var _=['00','01','02','03','04','05','06','07','08','09'],  //补零

38                 d = new Date(),

39                 h = d.getHours(),

40                 m = d.getMinutes(),

41                 s = d.getSeconds();

42             

43             return [_[h]||h,_[m]||m,_[s]||s].join(":");

44         };

45         //组件定义

46         var EzDigiClockComp = React.createClass({

47             //设置状态变量初始值

48             getInitialState : function(){

49                 return {

50                     time : _getTime(),

51                     myStyle: {

52                         color: "black"

53                     }

54                 };

55             },

56             //初次渲染后React执行此方法

57             componentDidMount : function(){

58                 //设置定时器

59                 this.timer = setInterval(function(){

60                     this.setState({time:_getTime()});

61                 }.bind(this),1000);

62             },

63             componentWillUpdate : function(m,n){

64                 if(n.time.substring(n.time.length-1)==="0") n.myStyle = {color : "red" }

65                 else n.myStyle = {color: "black"}

66             },

67             //即将从DOM树移除时执行此方法

68             componentWillUnmount : function(){

69                 //删除定时器

70                 clearInterval(this.timer);

71             },

72             render : function(){

73                 return     <div className="ez-digi-clock" style={this.state.myStyle}>

74                             {this.state.time}

75                         </div>;

76             }

77         });

78         //渲染

79         React.render(

80             <EzDigiClockComp />, 

81             document.querySelector("#content"));

82         

83     </script>

84 </body>

85 </html>

 

这里有个坑,不知道看官们踩到没。

即在componentWillUpdate中,如果我是用this.state.time去取值,而不是n.time去取,发现遇到了问题,实现不了效果,于是我加了console进去,发现this.state.time取到的还是之前的值。

即:

1 componentWillUpdate : function(m,n){

2                 console.log(this.state.time)

3                 if(this.state.time.substring(this.state.time.length-1)==="0") this.state.myStyle = {color : "red" }

4                 else this.state.myStyle = {color: "black"}

5                 console.log(this.state.time)

6             }

 

这点上面,我表示很疑惑哎,晚点去论坛上问问,如果看官们知道的话,帮我解解惑吧。。。。

 

那今天还是要学学新东西的。

访问DOM

我们在React中,还是需要去访问Virtual Dom的,因为我们这里已经没有了JQ,有时也不是访问实时的DOM节点,那在React中,我们怎么访问React元素的DOM对象呢?

 

答案是:ref属性React.findDOMNode(component)

ref:对于我们要访问的DOM,那么我们就对那个DOM设置ref属性

如:

1 //JSX

2 <input type="text" defaultvalue="beijing" ref="q" placeholder="请输入城市拼音,如:beijing">

声明了ref属性的DOM,我们通过this.refs获取到组件对象,比如this.refs.q,我们就获取到了这个组件对象,记着这时还不是获取到DOM

 

React.findDOMNode(component):这个才是获取DOM的操作。参数component是获取到的组件对象,而我们上一步的this.refs.q就是获取到的组件对象。

对于已经渲染到DOM树中的React元素,findDOMNode()方法则获取到的对应的DOM节点对象。之后就可以用标准的DOM API去操作了。

 

那下面我们来实践一下,要的效果是让输入框自动获取焦点,结合上一节中的componentDidMount()使用。

看官先自己思考下哈,然后看代码吧。

 1 <!DOCTYPE html>

 2 <html>

 3 <head>

 4     <meta charset="utf-8">

 5     <title>EzComp</title>

 6     <script src="lib/react.js"></script>

 7     <script src="lib/JSXTransformer.js"></script>

 8     <!--组件样式-->

 9     <style>

10         .ez-weather{

11             background : black;

12             color:white;

13             padding:10px;

14         }

15         .ez-search{

16             display: flex;

17             flex-flow:row nowrap;        

18         }

19         .ez-search input{

20             flex : 1 0 auto;

21         }

22         .ez-search button{

23             width:100px;

24             margin:0px 10px;

25         }

26     </style>

27 </head>

28 <body>

29     <div id="content"></div>

30     <script type = "text/jsx">

31         //定义组件

32         var EzWeatherComp = React.createClass({

33             //设置初始状态

34             getInitialState : function(){

35                 return {waiting:false};

36             },

37             componentDidMount: function(){

38                 React.findDOMNode(this.refs.q).focus()

39             },

40             render : function(){

41                 

42                 return     <div className="ez-weather">

43                             <div className="ez-search">

44                                 <input type="text" defaultValue="beijing" ref="q"

45                                     placeholder="请输入城市拼音,如:beijing"/>

46                             </div>

47                            </div>;

48             }

49         });

50         //渲染

51         React.render(

52             <EzWeatherComp/>,

53             document.querySelector("#content"));

54 

55     </script>

56 </body>

57 </html>

 

好吧,其实还是比较简单的。。。

 

既然上面用到了输入框这些表单,不知道看官注意到没,默认值我们是用的defaultValue,而不是value,这是React规定的 - -。。。

还有其他几个也提一下:

复选按钮:用defaultChecked而不是checked

1 //JSX

2 <input type="checkbox" defaultChecked=""> 

 

下拉选项:用defaultValue而不是selected

1 //JSX

2 <select defaultValue="A">

3     <option value="A">China</option>

4     <option value="B">India</option>

5     <option value="C">Japan</option>

6 </select>

 

好了,本篇就这些。

今天刚入职新公司,心情复杂哎~

 

你可能感兴趣的:(react)