React.js再探(四)

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

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

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

       当秒是0   变为

 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>

好了,本篇就这些。

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

时间: 2024-10-31 23:58:00

React.js再探(四)的相关文章

React.js再探(二)

上文中说到了组件了. 我们使用组件的目的最大莫过于复用,提供生产效率. 那么,这时候组件就应该能够提供一些”api”出来,让开发者去定义在不同场景下的不同表现,比如,行为或外观等. 而这些“api”就是 属性   在React中,用 props 访问实例元素的属性 属性:props 比如在JSX片段中,组件的实例元素有一个属性onoff: 1 React.render( 2 <ezlampcomp onoff="off"></ezlampcomp> , 3 do

React.js再探(三)

很多时候,组件实例的外观和行为我们通过props进行定制就可以了.因为任何时候,组件实例的表现只跟 传过来的props属性 相关. 我们称这种为 无状态/ stateless 组件 即它自身是 无记忆的 比如切换开关,它可以响应用户的点击事件,如果当前状态是关,那么它就 切换到开的状态(显示开状态的图片):而如果当前状态是开,那么它就切换到关的 状态(显示关状态的图片) 状态记忆:state React引入了状态机的概念,让组件具有不同的状态,使得组件具有记忆功能 具体如下: state ——组

React.js 基础入门四--要点总结

JSX语法,像是在Javascript代码里直接写XML的语法,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,React 官方推荐使用JSX, 当然你想直接使用纯Javascript代码写也是可以的,只是使用JSX,组件的结构和组件之间的关系看上去更加清晰. 1. HTML 标签 和 React 组件 在JS中写HTML标签,也许小伙伴们都惊呆了,那么React又是怎么区分HTML标签,React组件标签? HTML标签: var myDivEle

React.js终探(七)(完)

我们在前面介绍了组件的各种特性,这一节我们来说说多组件的情况. 在实际开发中,我们的组件难免会遇到有公共部分的情况,如果是个别情况还好,但如果数量比较多的话,那这时候,就需要公用了. 怎么公用呢? React为我们提供了它的方法. mixin:复用代码 可以把部分代码提出来公用.mixin是掺合混合的意思,即可以把一个对象的属性拷贝到另一个对象上. 使用mixin有两步: 定义一个mixin对象,即如 1 var EzLoggerMixin = { 2 log:function(){ 3 //s

react.js 从零开始(四)React 属性和状态详解

属性的含义和用法: 1.属性的含义. props=properties 属性:一个事物的性质和关系. 属性往往与生俱来,不可以修改. 2. 属性的用法. <Helloworld name=??? /> 这个name 可以是 变量 ,对象,数组,函数表达式的值. var props={ a:1, b:2 } <Helloworld {...props} /> 这样react就会自动遍历props对象并添加到属性中去. 状态的含义和用法: 1.状态的含义. state 状态:事物所处的

React.js终探(五)

在React中,一切都是看做组件. 而组件的嵌套也是十分常见的. 所以有的组件就作为容器组件 容器组件 React元素可以包含子元素 如 1 //JSX 2 <ezpanel title="title"> 3 <p>this is demo content</p> 4 </ezpanel> 在React中,用this.props.children可以访问子元素 如: 1 var EzPanel = React.createClass({

再谈React.js实现原生js拖拽效果

前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目地就是要尽量避免直接操作dom元素,所以我们在对dom元素进行操作的时候需要注意,我之前为了获取form的参数就直接用了var dragBox=document.getElementById('form')去找dom,但是其实记录from的初始位置,可以在其子组件更新父组件参数的时候调用.即在MyF

再探 butterfly.js - grunt.js篇(一)

再探 butterfly.js - grunt.js篇(一) 神器 grunt.js 久仰grunt.js的大名,学习grunt.js一直是我todo List的第一位.趁着新春佳节来临之际(打酱油的日子),就来填了这个坑,完了这个心愿. grunt.js的强大,强大在于它拥有很多用途丰富的插件,和不同插件之间的联动实现更牛逼的功能. 这里默认大家已经安装了npm和会用npm install等指令,就不详细讲了.下面讲用到grunt-contrib-watch和grunt-contrib-con

再探 butterfly.js - 奇异的留白

再探 butterfly.js - 奇异的留白 事情经过 在 梓凡兄 捣鼓他的 豆瓣FM 播放器的时候,发现了butterfly.js会在ipad的横屏模式(landscape mode)的时候对<html>添加class="ipad ios7".更加离奇的是在butterfly.css有以下样式: @media (orientation:landscape){ html.ipad.ios7 > body{ position:fixed;bottom:0;width: