真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

React.js基礎(chǔ)入門(mén)四--要點(diǎn)總結(jié)

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的霸州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

JSX語(yǔ)法,像是在Javascript代碼里直接寫(xiě)XML的語(yǔ)法,實(shí)質(zhì)上這只是一個(gè)語(yǔ)法糖,每一個(gè)XML標(biāo)簽都會(huì)被JSX轉(zhuǎn)換工具轉(zhuǎn)換成純Javascript代碼,React 官方推薦使用JSX, 當(dāng)然你想直接使用純Javascript代碼寫(xiě)也是可以的,只是使用JSX,組件的結(jié)構(gòu)和組件之間的關(guān)系看上去更加清晰。

1. HTML 標(biāo)簽 和 React 組件

    在JS中寫(xiě)HTML標(biāo)簽,也許小伙伴們都驚呆了,那么React又是怎么區(qū)分HTML標(biāo)簽,React組件標(biāo)簽?

HTML標(biāo)簽:

var myDivElement = ;
React.render(myDivElement, document.body);

React組件標(biāo)簽:

  1. var Div= React.createClass({/*...*/});

  2. var myElement = << span="">Div someProperty={true} />;

  3. React.render(myElement, document.body);    

    插播:

        1. 注意大寫(xiě)開(kāi)頭* 

        2. 不要隨意document.body, 它是覆蓋不是追加。(及時(shí)代碼找的回來(lái))

        3. 屬性someProperty={true}

是不是很簡(jiǎn)單,一眼就發(fā)現(xiàn)了,congruatulations 聰明的你已經(jīng)理解!

2. JSX與原生態(tài)JavaScript 

	//使用JSX
React.render(	content,
	document.getElementById('example')
);
//不使用JSX
React.render(
	React.createElement('div', null,
		React.createElement('div', null,
			React.createElement('div', null, 'content')
		)
	),
	document.getElementById('example')
);

那么也就是說(shuō),我們寫(xiě)一個(gè)XML標(biāo)簽,實(shí)質(zhì)上就是在調(diào)用 React.createElement 這個(gè)方法,并返回一個(gè) ReactElement 對(duì)象。

API中:

React.createElement

ReactElement createElement(
  string/ReactClass type,
  [object props],
  [children ...])  #注意此處的省略號(hào)

第一個(gè)參數(shù)可以是一個(gè)字符串,表示是一個(gè)HTML標(biāo)準(zhǔn)內(nèi)的元素,或者是一個(gè)ReactClass類(lèi)型的對(duì)象,表示我們之前封裝好的自定義組件。

第二個(gè)參數(shù)是一個(gè)對(duì)象,或者說(shuō)是字典也可以,它保存了這個(gè)元素的所有固有屬性(即傳入后基本不會(huì)改變的值)。

從第三個(gè)參數(shù)開(kāi)始,之后的參數(shù)都被認(rèn)作是元素的子元素。

JSX的轉(zhuǎn)換

React JSX 將元素的標(biāo)簽、屬性和子元素都會(huì)被當(dāng)作參數(shù)傳給 React.createElement 方法:

		// JSX
		var Nav;
		var app = ;
		
		// native JS
		var Nav;
		var app = React.createElement(Nav, {color:"blue"});
JSX的轉(zhuǎn)化器

    這個(gè)工具會(huì)把使用JSX語(yǔ)法的文件轉(zhuǎn)換成純的可以直接在瀏覽器里面運(yùn)行起來(lái)的JavaScript文件。它也會(huì)為你監(jiān)視目錄,然后自動(dòng)轉(zhuǎn)換變化的文件

    要把帶有JSX語(yǔ)法的代碼轉(zhuǎn)化為純Javascript代碼,有多種方式:

1. 對(duì)于內(nèi)聯(lián)與HTML中的代碼或者是未經(jīng)過(guò)轉(zhuǎn)化的外部文件,在 script 標(biāo)簽中要加上 type="text/jsx" ,并引入 JSXTransformer.js 文件即可。

2. 不過(guò)這種方式并不建議在生產(chǎn)環(huán)境使用,建議的方法是在代碼上線(xiàn)前就將代碼轉(zhuǎn)換好,可以使用npm 全局安裝 react-tools :

#npm install react-tools -g

并使用命令行工具轉(zhuǎn)化即可(具體用法可以參考 jsx -h 或者 jsx --help ) jsx 通過(guò)watch實(shí)時(shí)監(jiān)控,具體使用看幫助吧。此處只列舉試?yán)?/p>

# jsx --watch src/ build/

( #表示linux中的用戶(hù)權(quán)限,windows用戶(hù)大可不用理睬 )

大愛(ài)無(wú)邊的React. render

React.render方法可以渲染HTML結(jié)構(gòu),也可以渲染React組件。 

(此處與上面重復(fù),只做演示)

  1.  渲染HTML標(biāo)簽,聲明變量采用 字母寫(xiě)

var myDivElement = ;
React.render(myDivElement, document.body);	

2.   渲染React組件,聲明變量采用 字母寫(xiě)

var MyComponent = React.createClass({/*...*/});
var myElement = ;
React.render(myElement, document.body);	

不過(guò)需要注意的是 class 和 for 屬性(不太確定多少個(gè),等查閱api后續(xù)增加),JSX語(yǔ)法最終是要被轉(zhuǎn)換為純Javascript的,所以要和在Javascript DOM中一樣, 用className 和 htmlFor 。

//使用JSX
React.render(	content,
	document.getElementById('example')
);
//不使用JSX
React.render(
	React.createElement('label', {className: 'xxx', htmlFor: 'input'}, 'content'),
	document.getElementById('example')
);	

相信你一眼就瞅出了不同點(diǎn)。

可惡但有可愛(ài)之處:

在創(chuàng)建HTML標(biāo)準(zhǔn)內(nèi)的元素時(shí),JSX轉(zhuǎn)化器會(huì)丟棄那些非標(biāo)準(zhǔn)的屬性,如果一定要添加自定義屬性,那么需要在這些自定義屬性之前添加 data- 前綴。

上同樣的代碼:

var HtmlOptions = React.createClass({
	render:function (){
		return (			 屬性延伸
		);
	}
});

var ys = ; 
React.render(ys, document.getElementById('htmls'));

渲染后,看看你的標(biāo)簽總是否有zz的屬性,恭喜你........

是不是沒(méi)有? 哈哈,那就對(duì)了, 把zz替換成data-zz試試。

看上去高大上的用法(捂住)

有人說(shuō),用了這些寫(xiě)法后,不會(huì)再寫(xiě)原生態(tài)的JS代碼了, 是的,懶(和)做(諧)才會(huì)是天朝。

比如開(kāi)發(fā)組件的時(shí)候,一個(gè)組件有多個(gè)子組件,你希望這些子組件可以作為其父組件的屬性,那么可以像這樣用:

var Form = MyFormComponent;
var App = (	);	

插播: 此處又要插播了(這是我們的愛(ài)好,插播才能提升質(zhì)量)

React 組件標(biāo)簽

這樣的寫(xiě)法表示 自閉合標(biāo)簽(

還要注意:都要開(kāi)頭大寫(xiě),并且加上父類(lèi)組件標(biāo)簽哦。為啥呢? follow

這樣你只需將子組件的 ReactClass 作為其父組件的屬性:

var MyFormComponent = React.createClass({ ... });
MyFormComponent.Row = React.createClass({ ... });
MyFormComponent.Label = React.createClass({ ... });
MyFormComponent.Input = React.createClass({ ... });	

利用子組件 和 父組件形式 再來(lái)渲染。

然而這也是可以的:

	var App = (
		React.createElement(Form, null,
		    React.createElement(Form.Row, null,
		        React.createElement(Form.Label, null),
		        React.createElement(Form.Input, null)
		    )
		)
	);

該功能需要0.11及以上版本

Javascript表達(dá)式

在JSX語(yǔ)法中寫(xiě)Javascript表達(dá)式只需要用 {} 即可,比如下面這個(gè)使用三目運(yùn)算符的例子:

JSX是HTML和JavaScript混寫(xiě)的語(yǔ)法,當(dāng)遇到 < ,JSX就當(dāng)HTML解析,遇到 { 就當(dāng)JavaScript解析。

	// Input (JSX):
	var content = {window.isLoggedIn ?  : };
	// Output (JS):
	var content = React.createElement(
		Container,
		null,
		window.isLoggedIn ? React.createElement(Nav) : React.createElement(Login)
	);	

屬性表達(dá)式
	React.render(
		 1 ? 'class-a' : 'class-b'}>content
, document.body );
子表達(dá)式
	var Nav = React.createClass({
		render: function () {
		return 
nav
} }); React.render(
    {2 > 1 ? 
, document.body );

臥去, so easy!是不是?

相信你會(huì)想到這樣寫(xiě)更碉堡。

	// This JSX:
	Hello World!
// Is transformed to this JS: React.createElement("div", {id: if (condition) { 'msg' }}, "Hello World!");

多高大上啊??上?strong>錯(cuò)誤的

這讓我想起了PHP中html與php混淆的寫(xiě)法。

0 ){ echo '碉堡了'; } ?>

 或者Pyhon中

[x+n for x in range(0,100) for n in range(0,10) if x%3==0 if n%5==0 ]

看不懂,超碉堡?。?CAO, 是難看,不是看著難。

可以從轉(zhuǎn)化后的Javascript代碼中看出明顯的語(yǔ)法錯(cuò)誤,所以要不用三目運(yùn)算符,要不就這樣寫(xiě):

	if (condition) Hello World!
else 
Hello World!

以下純屬賦值粘貼: 但經(jīng)過(guò)驗(yàn)證,很不錯(cuò)

傳播屬性(Spread Attributes)

如果提前就知道了組件的屬性的話(huà),寫(xiě)起來(lái)很容易。例如component組件有兩個(gè)動(dòng)態(tài)的屬性foo和bar:

var component = ;

而實(shí)際上,有些屬性可能是后續(xù)添加的,我們沒(méi)辦法一開(kāi)始就確定,我們可能會(huì)寫(xiě)出下面不好的代碼:

var component = ;
component.props.foo = x; // bad
component.props.bar = y; // also bad	

這樣寫(xiě)是錯(cuò)誤的,因?yàn)槲覀兪謩?dòng)直接添加的屬性React后續(xù)沒(méi)辦法檢查到屬性類(lèi)型錯(cuò)誤,也就是說(shuō),當(dāng)我們手動(dòng)添加的屬性發(fā)生類(lèi)型錯(cuò)誤時(shí),在控制臺(tái)是看不到錯(cuò)誤信息的。

在React的設(shè)定中,初始化完props后,props是不可變的。改變props會(huì)引起無(wú)法想象的后果。

延伸屬性

為了解決這個(gè)問(wèn)題,React引入了屬性延伸

	        var props = {};
		props.foo = x;
		props.bar = y;
		var component = ;
		//或者
		var props = { foo: x, bar: y };
		var component = ;	

這樣就相當(dāng)于:

var component = 

當(dāng)需要拓展我們的屬性的時(shí)候,定義個(gè)一個(gè)屬性對(duì)象,并通過(guò) {…props} 的方式引入,在JSX中,可以使用 ... 運(yùn)算符,表示將一個(gè)對(duì)象的鍵值對(duì)與 ReactElement 的 props 屬性合并,這個(gè) ... 運(yùn)算符的實(shí)現(xiàn)類(lèi)似于ES6 Array中的 ... 運(yùn)算符的特性。,React會(huì)幫我們拷貝到組件的props屬性中。重要的是—這個(gè)過(guò)程是由React操控的,不是手動(dòng)添賦值的屬性。

它也可以和普通的XML屬性混合使用,需要同名屬性,后者將覆蓋前者:

var props = { foo: 'default' };
var component = ;
console.log(component.props.foo); // 'override'	

JSX 陷阱

style屬性

在React中寫(xiě)行內(nèi)樣式時(shí),要這樣寫(xiě),不能采用引號(hào)的書(shū)寫(xiě)方式

React.render(
		
		xxxxx
		,
		document.body
);	
HTML轉(zhuǎn)義

比如我們有一些內(nèi)容是用戶(hù)輸入的富文本,從后臺(tái)取到數(shù)據(jù)后展示在頁(yè)面上,希望展示相應(yīng)的樣式.

var content='content';
		React.render(
		
{content}
, document.body );

結(jié)果頁(yè)面直接輸出內(nèi)容了:

content

React默認(rèn)會(huì)進(jìn)行HTML的轉(zhuǎn)義,避免XSS***,如果要不轉(zhuǎn)義,可以這么寫(xiě):

var content='content';
		React.render(
		,
		document.body
		);	

最后推薦一個(gè)的博文博客:(沒(méi)有看,大家可參考閱讀)

http://blog.csdn.net/lihongxun945/article/details/45826851

http://blog.csdn.net/lihongxun945/article/category/5195241

阮一峰的react.js入門(mén)

本文來(lái)自鏈接:http://sowm.cn/css88/article/q6fiAf.html


名稱(chēng)欄目:React.js基礎(chǔ)入門(mén)四--要點(diǎn)總結(jié)
網(wǎng)頁(yè)路徑:http://weahome.cn/article/gdgies.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部