React.js终探(七)(完)

我们在前面介绍了组件的各种特性,这一节我们来说说多组件的情况。

在实际开发中,我们的组件难免会遇到有公共部分的情况,如果是个别情况还好,但如果数量比较多的话,那这时候,就需要公用了。

 

怎么公用呢?

React为我们提供了它的方法。

 

mixin:复用代码

可以把部分代码提出来公用。mixin是掺合混合的意思,即可以把一个对象的属性拷贝到另一个对象上。

 

使用mixin有两步:

  • 定义一个mixin对象,即如
1 var EzLoggerMixin = {
2     log:function(){
3         //sth. happened here.
4     }
5 };

 

  • 使用React.createClass时,给传入的原型对象设置mixins属性
1 React.createClass({
2     mixins:[EzLoggerMixin],
3     render:function(){
4         //your render stuff.
5     }
6 });

可以看出,mixins属性是一个数组,表示可以传多个mixin对象,但是注意注意,传入的mixin对象中,不要有同名属性

 

来个例子:

 

定义一个日志的mixin对象,React组件使用mixin获得日志的输入能力。

 

上代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <title>Component Mixins</title>
 6     <script src="lib/react.js"></script>
 7     <script src="lib/JSXTransformer.js"></script>
 8     <style>
 9         .ez-logger{
10             position:fixed;
11             left:0px;
12             bottom:0px;
13             height:100px;
14             width:100%;
15             background:#000;            
16             color:#fff;
17         }
18     </style>
19 </head>
20 <body>
21     <div id="content"></div>
22     <script type = "text/jsx">
23         //日志mixin
24         var EzLoggerMixin = {
25             log:function(txt){
26                 //按需撞见日志板DOM对象
27                 if(!window._logger_){
28                     var el = window._logger_  = document.createElement("pre");
29                     el.className = "ez-logger";
30                     document.body.appendChild(el);
31                 }
32                 //计算时间戳
33                 var time = new Date,
34                     h = time.getHours(),
35                     m = time.getMinutes(),
36                     s = time.getSeconds(),
37                     ts = [h,m,s].join(":");
38                     
39                 //this.constructor.displayName表示组件的显示名,React自动设置该属性    
40                 var compName = "[" + this.constructor.displayName + "]";
41                 
42                 //输出到日志板
43                 window._logger_.innerText = [window._logger_.innerText, ts + compName + " : " + txt].join("\n");
44             }
45         };
46         //组件1定义
47         var EzDemo1Comp = React.createClass({
48             mixins : [EzLoggerMixin], //使用日志mixin
49             componentDidMount : function(){
50                 this.log("component rendered!");
51             },
52             render : function(){
53                 this.log("rendering the component");
54                 return     <div>
55                             <p>This is a demo component.</p>
56                         </div>;
57             }
58         });
59         //组件2定义
60         var EzDemo2Comp = React.createClass({
61             mixins : [EzLoggerMixin],  //使用日志mixin
62             componentDidMount : function(){
63                 this.log("component rendered!");
64             },
65             render : function(){
66                 this.log("rendering the component");
67                 return     <div>
68                             <p>This is another demo component.</p>
69                         </div>;
70             }
71         });
72         //渲染
73         React.render(
74             <div>
75                 <EzDemo1Comp/>
76                 <EzDemo2Comp/>
77             </div>,
78             document.querySelector("#content"));
79     </script>
80 </body>
81 </html>

 

值得一提的是:

this.constructor.displayName是获得当前组件的显示名,这个是React自动设置的属性

 

 

好了,探索React的学习的系列大体就到这里了。之后必要的话,会继续深入写React相关的。谢谢大家思密达

posted @ 2015-06-20 00:14  GalenYip  阅读(757)  评论(4编辑  收藏  举报