首頁 web前端 html教學 JSX與HTML的那些不同

JSX與HTML的那些不同

Mar 31, 2017 pm 12:02 PM
reactjs

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

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

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

var HelloReact = React.createClass({
    render: function() {
        return (<h1 className=&#39;title&#39;>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

JSX

模板

HTML

var name = &#39;Daryl&#39;,
    templ = &#39;<p>&#39; + name + &#39;</p>&#39;; //<p>Daryl</p>
登入後複製

JSX

render: function()
 {    var name = &#39;Daryl&#39;;    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 ? &#39;styles1&#39; : &#39;styles2&#39;}></div>);
}
登入後複製

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

render: function() {
  var nowDate = new Date(),
     today = nowDate.getFullYear() + &#39;.&#39; + Number(nowDate.getMonth()+1) + &#39;.&#39; + nowDate.getDate();
  return (<p>Today is {today}.</p>); //2016.3.7
}
登入後複製

内嵌样式

HTML

<div style="width:30px;height:30px;background-color:red"></div>
登入後複製

JSX

<div style={{width:30,height:30,backgroundColor:&#39;red&#39;}}></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: &#39;center&#39;
  },
  title: {
    fontSize: 20,
    fontWeight: bold,
    color: &#39;#000&#39;
  },
  content: {
    fontSize: 13,
    color: &#39;rgba(0,0,0,0.5)&#39;
  }
};
登入後複製

以上这种方式让样式和内容的耦合降低,代码维护也更方便。只不过在使用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(&#39;让你点你就点?&#39;);
    }
});
登入後複製

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

列表

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

var dataArr = [1,2,3,4,5,6,7],
    templ = &#39;&#39;;
dataArr.forEach(function(item, index) {
    templ += &#39;<div>&#39; + item + &#39;</div>&#39;;
});
$(&#39;body&#39;).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等,博主会在之后的博文里阐述用法。


以上是JSX與HTML的那些不同的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML5中跨瀏覽器兼容性的最佳實踐是什麼? HTML5中跨瀏覽器兼容性的最佳實踐是什麼? Mar 17, 2025 pm 12:20 PM

文章討論了確保HTML5跨瀏覽器兼容性的最佳實踐,重點是特徵檢測,進行性增強和測試方法。

&gt; gt;的目的是什麼 元素? &gt; gt;的目的是什麼 元素? Mar 21, 2025 pm 12:34 PM

本文討論了HTML&lt; Progress&gt;元素,其目的,樣式和與&lt; meter&gt;元素。主要重點是使用&lt; progress&gt;為了完成任務和LT;儀表&gt;對於stati

如何使用HTML5表單驗證屬性來驗證用戶輸入? 如何使用HTML5表單驗證屬性來驗證用戶輸入? Mar 17, 2025 pm 12:27 PM

本文討論了使用HTML5表單驗證屬性,例如必需的,圖案,最小,最大和長度限制,以直接在瀏覽器中驗證用戶輸入。

&lt; datalist&gt;的目的是什麼。 元素? &lt; datalist&gt;的目的是什麼。 元素? Mar 21, 2025 pm 12:33 PM

本文討論了html&lt; datalist&gt;元素,通過提供自動完整建議,改善用戶體驗並減少錯誤來增強表格。Character計數:159

&lt; meter&gt;的目的是什麼。 元素? &lt; meter&gt;的目的是什麼。 元素? Mar 21, 2025 pm 12:35 PM

本文討論了HTML&lt; meter&gt;元素,用於在一個範圍內顯示標量或分數值及其在Web開發中的常見應用。它區分了&lt; meter&gt;從&lt; progress&gt;和前

視口元標籤是什麼?為什麼對響應式設計很重要? 視口元標籤是什麼?為什麼對響應式設計很重要? Mar 20, 2025 pm 05:56 PM

本文討論了視口元標籤,這對於移動設備上的響應式Web設計至關重要。它解釋瞭如何正確使用確保最佳的內容縮放和用戶交互,而濫用可能會導致設計和可訪問性問題。

&lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼? &lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼? Mar 20, 2025 pm 06:05 PM

本文討論了&lt; iframe&gt;將外部內容嵌入網頁,其常見用途,安全風險以及諸如對象標籤和API等替代方案的目的。

HTML容易為初學者學習嗎? HTML容易為初學者學習嗎? Apr 07, 2025 am 12:11 AM

HTML適合初學者學習,因為它簡單易學且能快速看到成果。 1)HTML的學習曲線平緩,易於上手。 2)只需掌握基本標籤即可開始創建網頁。 3)靈活性高,可與CSS和JavaScript結合使用。 4)豐富的學習資源和現代工具支持學習過程。

See all articles