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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

&lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

&lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

&lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

&lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? &lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、&lt; iframe&gt;外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

See all articles