zoukankan      html  css  js  c++  java
  • ReactJS实用技巧(1):JSX与HTML的那些不同

    在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑。不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档。

    JSX本质上与HTML并多大没关系,标题所说的不同是指语法上的不同。正因为二者比较相似,初心者才会在很多细节地方混淆。

    JSX实际是一种语法糖,最终会转换成JavaScript代码,首先我们看一段React最简单的组件结构:

    var HelloReact = React.createClass({
        render: function() {
            return (<h1 className='title'>Hello React</h1>);
        }
    });
    
    React.render(<HelloReact />, document.querySelector(#container));

    首先我们创建了一个只包含h1标签的组件,并将其保存在名为HelloReact的变量中,之后将其作为标签名,渲染到id为"container"的DOM节点中。

    这里要注意的是,组件保存的变量名首字母必须大写,否则无法渲染成功。接下来看下jsx被转义后的语法是什么样的:

    var HelloReact = React.createClass({
        render: function() {
            React.createElement('h1', {className: 'title'}, 'Hello world')
        }
    });
    
    React.render(<HelloReact />, document.querySelector(#container));

    可以看到使用JSX可以大大简化编写难度,这点在多个组件嵌套时更加明显。正因为JSX的存在使得新手对React的学习成本大大降低。

    *此文的示例多是React老版本的语法,新版本的React移除了JSXTransformer.js文件,增加了react-dom.js文件。 博主会在之后的博文中详述新版本的语法及工程创建方法,当然最快的方式还是查阅官方更新文档。

    下面列出相似但又不同的地方:

    类名

    HTML

    <div class="myStyle"></div>

    JSX

    <div className="myStyle"></div>

    模板

    HTML

    var name = 'Daryl',
        templ = '<p>' + name + '</p>'; //<p>Daryl</p>

     JSX

    render: function() {
        var name = 'Daryl';
        return (<p>{name}</p>);
    }

    在JSX的语法中,大括号括起来的部分会被当做JavaScript代码来解析。不仅仅是在标签之间,在class、style等等属性赋值时均可以使用大括号来进行。需要注意的是,大括号之之间只能写表达式,而不能写判断等语句

    render: function() {
        var a = 1;
        return (<p>{++a}</p>); //正确
    }
    
    render: function() {
       var a = 1;
    return (<p>{if (true) {a++;}}</p> //报错 }

    对于需要判断状态的情况可以多使用逻辑运算符(||、&&等)以及三目运算符来完成。

    render: function() {
        var status = true;
        return (<div className={status ? 'styles1' : 'styles2'}></div>);
    }

    如果判断的逻辑比较复杂,简单的表达式无法满足要求,还是使用保存于变量中方法。

    render: function() {
      var nowDate = new Date(),
         today = nowDate.getFullYear() + '.' + Number(nowDate.getMonth()+1) + '.' + nowDate.getDate();
      return (<p>Today is {today}.</p>); //2016.3.7
    }

    内嵌样式

    HTML

    <div style="30px;height:30px;background-color:red"></div>

    JSX

    <div style={{30,height:30,backgroundColor:'red'}}></div>

    可以看到JSX中的style属性并不是简单的接收一个字符串,那两层大括号是什么意思呢。其本质是接收一个对象作为参数,最外层的大括号是之前说过的用来解析JS代码的区域,而里面的只是个对象而已。

    具体的样式属性名称类似jQuery中的驼峰命名方式。同时可以使用以下的写法:

    React.create({
      render: function() {
        return (<div style={styles.container}>
                     <p style={styles.title}>标题</p>
                     <p style={styles.content}>内容</p>
            </div>);
        }
    }); 
    
    var styles = {
      container: {
        textAlign: 'center'
      },   title: {     fontSize:
    20,     fontWeight: bold,
        color: '#000'   },   content: {     fontSize: 13,
        color: 'rgba(0,0,0,0.5)'   } };

    以上这种方式让样式和内容的耦合降低,代码维护也更方便。只不过在使用React开发中,可能更多的人还是习惯使用外联样式表来编写CSS。

    其实这种写法应用最多的是在开发React Native项目中,通过StyleSheet创建一个样式集,因为React Native的项目不像普通的WEB工程可以很方便的引入样式表。

    事件绑定

    HTML

    <div onclick="myFunction()"></div>

    JSX 

    React.createClass({
        render: function() {
            return (<div onClick={this.handlerClick}>点我!</div>);
        },
        handlerClick: function() {
            alert('让你点你就点?');
        }
    }); 

    在JSX中事件属性都是以驼峰命名的方式,HTML中的内嵌事件的编写方式在JSX语法中是无效的。

     

    列表

    列表是现在的web应用中是不可缺少的一种结构。传统的方式通常为请求到数据集,通过JS遍历生成节点,添加到DOM中:

    var dataArr = [1,2,3,4,5,6,7],
        templ = '';
    dataArr.forEach(function(item, index) {
        templ += '<div>' + item + '</div>';
    });
    $('body').append(templ);

    如上,是我们使用的一种比较"原始"的方法。React其实是一个状态机,其中数据结构和视图绑定在一起,一切以状态来控制,通过改变数据层触发DOM更改。

    虽然在React中也可以直接操作DOM,但是并不提倡,只有在万不得已或者某个东西加入到状态中十分繁琐、代价比较大的情况下才去考虑。

    下面我们看下在JSX中是如何渲染列表的:

    render: function() {
        var dataArr = [1,2,3,4,5,6,7],
            jsxArr = [];
        dataArr.forEach(function(item, index) {
            jsxArr.push(<li>{item}</li>);
        });
        return (<ul>{jsxArr}</ul>);
    }

    上例中jsxArr实为一个每项均为JSX标签模板的数组,这段代码反映出React中一个很重要的特性,JSX标签之前的多子节点可以以数组的方式插入,理解这点就能很快地绕过了React中列表的坑。只是在实际开发中我们通常使用下面的方式:

    render: function() {
        var dataArr = [1,2,3,4,5,6,7];
        return (<ul>
              {
                  dataArr.map(function(item, index) {
                     return (<li>{item}</li>);
                  });
              }
            </ul>);
    } 

    当然在列表模板结构比较复杂的情况下,还是建议在return之前生成好,并赋值给某一变量,return时在标签之间插入该变量。

    除了上述这些不同点以外,JSX还有着自己独有的某些属性,比如:ref、key等,博主会在之后的博文里阐述用法。

    感谢您的浏览,希望能有所帮助。

  • 相关阅读:
    C语言学习笔记(二)数据类型、常量和变量简介
    将汉字转换为汉语拼音java实现
    C语言学习笔记(四)运算符与表达式(下)
    数组的几种排序算法的实现
    C语言学习笔记(三)运算符与表达式(上)
    java实现二叉树的常见操作
    java解析Internet网页中的内容
    C语言学习笔记(六)分支程序设计
    C语言学习笔记(一)初识C语言
    C语言学习笔记(五)顺序程序设计
  • 原文地址:https://www.cnblogs.com/ghost-xyx/p/5248323.html
Copyright © 2011-2022 走看看