React.js再探(二)

上文中说到了组件了。

我们使用组件的目的最大莫过于复用,提供生产效率。

那么,这时候组件就应该能够提供一些”api”出来,让开发者去定义在不同场景下的不同表现,比如,行为或外观等。

而这些“api”就是 属性

 

在React中,用 props 访问实例元素的属性

属性:props

比如在JSX片段中,组件的实例元素有一个属性onoff:

1 React.render(
2   <ezlampcomp onoff="off"></ezlampcomp> ,
3   document.querySelector("#content"));

在组件的实现中,我们可以通过props字段访问这个属性。

在JSX中,我们可以将JS表达式赋给React元素的属性,这个需要使用一对大括号

1 var myOnoff = "on";
2 React.render(
3 <ezlampcomp onoff="{myOnoff}"></ezlampcomp>,
4 document.querySelector("#content"));

当然,为了更好理解,我们把JSX转换成JS看看:

 1 var myOnoff = "on";
 2 React.render(
 3     React.createElement(
 4         EzLampComp,
 5         {
 6             onoff : myOnoff
 7         }
 8     ),
 9     document.querySelector("#content")
10 );

我们先来练下手,用表达式的方式去实现一个闪动的效果,其中类名 ez-lamp表示一个灯。

直接上代码了。

下面是CSS:

 1 <style>
 2 .ez-lamp{
 3   display : inline-block;
 4   margin : 5px;
 5   width : 30px;
 6   height : 30px;
 7   border-radius : 50%;
 8 }
 9 .ez-lamp.on{
10   opacity : 1;
11   background : -webkit-radial-gradient(30% 30%,white 5%,red 95%);
12 }
13 .ez-lamp.off{
14   opacity : 0.5;
15    background : -webkit-radial-gradient(30% 30%,#888 5%,red 95%);
16 }
17 </style>

下面是实现部分:

 1 <script type = "text/jsx">
 2 //定义React组件
 3 var EzLampComp = React.createClass({
 4   render : function(){
 5
 6   //取得属性值
 7   var onoff = this.props.onoff;
 8
 9 //返回React元素
10   if(onoff == "on")
11   return <span className = "ez-lamp on"></span>;
12   else
13   return <span className = "ez-lamp off"></span>;
14   }
15 });
16
17 var myOnoff = "on";
18
19 setInterval(function() {
20
21 //渲染React元素
22 React.render(
23   <EzLampComp onoff={myOnoff}/> ,
24   document.querySelector("#content"));
25
26   myOnoff = myOnoff == "on" ? "off" : "on";
27
28 }, 1000);
29
30
31 </script>

注意:上一篇里面说了,JSX里面虽然写起来跟HTML差不多,但是CSS类名还是要用className

内联样式

有时候我们不得已,必须要用内联样式。

在React中内联样式必须是一个JSON对象,字段对应样式属性名称,比如要渲染出

1 //HTML
2 <div style=“borderRadius:50%;height:200px;width:200px"></div>

我们需要这样写React

 1 var myStyle = {
 2     borderRadius:”50%",
 3     width:"200px",
 4     height:"200px"
 5 };
 6 //JSX
 7 var e = <div style="{myStyle}"></div>;
 8 //JavaScript
 9 var e = React.createElement(
10     "div",{
11         style : myStyle
12     }
13 );
14 //render
15 React.render(e,...);

注意:

  1. 对应的属性名称需要用驼峰式,如border-radius要用borderRadius,background-image要用backgroundImage
  2. hack的前缀(-webkit, -moz, -o, -ms),除了ms,其他首字母都要大写,如-webkit-transition就是WebkitTransition, -ms-transition就是msTransition

比如我们要实现这样的效果

用内联样式实现的方法如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title>ex15:EzLampComp</title>
 6 <script src="lib/react.js"></script>
 7 <script src="lib/JSXTransformer.js"></script>
 8 <style>
 9 .ez-lamp{
10 display : inline-block;
11 margin : 5px;
12 width : 30px;
13 height : 30px;
14 }
15 </style>
16 </head>
17 <body>
18 <div id="content"></div>
19 <script type = "text/jsx">
20 //定义React组件
21 var EzLampComp = React.createClass({
22   render : function(){
23     //取得属性值
24     var color = this.props.color,
25     onoff = this.props.onoff;
26     //亮光颜色
27     var lights = {
28       "off":"#888",
29       "on":"#fff"
30     };
31     //透明度
32     var opacity ={
33       "off":0.5,
34       "on":1.0
35     };
36     //根据属性设置附加的样式
37     var style = {
38       borderRadius : "50%", //对应样式:border-radius
39       opacity : opacity[this.props.onoff],
40       background : "-webkit-radial-gradient(30% 30%," + lights[onoff] + " 5%," + color +" 95%)"
41     };
42     //返回React元素
43     return <span className="ez-lamp" style={style}></span>; //JSX
44   }
45 });
46 //渲染React元素
47 React.render(
48 <div>
49   <EzLampComp color="green" onoff="off"/>
50   <EzLampComp color="green" onoff="on"/>
51   <EzLampComp color="red" onoff="off"/>
52   <EzLampComp color="red" onoff="on"/>
53   <EzLampComp color="blue" onoff="off"/>
54   <EzLampComp color="blue" onoff="on"/>
55 </div>
56 ,document.querySelector("#content"));
57 </script>
58 </body>
59 </html>

先喝口水休息一下先....

时间: 2024-10-09 21:10:36

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

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&qu

React.js再探(三)

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

React.js终探(七)(完)

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

.Net平台-MVP模式再探(二)

PS: 本文与上一遍文章没有什么必然的联系,可以说是对于MVP的一定的加深,或许在理解上比上一篇多有点难度. 正文 如果从层次关系来讲,MVP属于Presentation层的设计模式.对于一个UI模块来说,它的所有功能被分割为三个部分,分别通过Model.View和Presenter来承载.Model.View和Presenter相互协作,完成对最初数据的呈现和对用户操作的响应,它们具有各自的职责划分. 一.简单讲讲MVP是什么玩意儿 如果从层次关系来讲,MVP属于Presentation层的设

React.js 基础入门二--组件嵌套

组件:在设计接口的时候,将常用元素(按钮,表单字段,布局组件等)分解成定义好接口的可重用组件.这样下次你在创建同样界面就可以少写很多代码,这意味着更快的开发时间,更少的bug,和更少的内容下载. 将上章节Index.html中Js部分修改为: <script type="text/jsx">   // 注意此处                 // 定义web组件 (<font color="#ff0000">MessageBox 错误组件嵌

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 从零开始(二)组件的生命周期

什么是生命周期? 组件本质上是一个状态机,输入确定,输出一定确定. 当状态改变的时候 会触发不同的钩子函数,可以让开发者做出响应.. 一个组件的生命周期可以概括为 初始化:状态下 可以自定义的函数 getDefaultProps object getDefaultProps() 在组件类创建的时候调用一次,然后返回值被缓存下来.如果父组件没有指定 props 中的某个键,则此处返回的对象中的相应属性将会合并到 this.props (使用 in 检测属性). 该方法在任何实例创建之前调用,因此不

再谈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