成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

構(gòu)建自己的React:(2)Element creation and JSX

Jensen / 1470人閱讀

摘要:翻譯自這里上一節(jié)我們介紹了,使用了一種很麻煩的方法來(lái)代表要渲染的。這一節(jié)我們將介紹如何使用來(lái)創(chuàng)建。上面代碼排除了子元素為,和的情況。代碼頭部的注釋告訴了去使用來(lái)轉(zhuǎn)義。下一節(jié)我們將往中加入虛擬和用來(lái)支持更新操作的一致性校驗(yàn)算法。

Didact: Element creation and JSX

翻譯自這里:https://engineering.hexacta.c...

JSX

上一節(jié)我們介紹了Didact Elements,使用了一種很麻煩的方法來(lái)代表要渲染的DOM。這一節(jié)我們將介紹如何使用JSX來(lái)創(chuàng)建Didact Elements。

下面是一個(gè)Didact Elements的原生對(duì)象表示:

const element = {
  type: "div",
  props: {
    id: "container",
    children: [
      { type: "input", props: { value: "foo", type: "text" } },
      {
        type: "a",
        props: {
          href: "/bar",
          children: [{ type: "TEXT_ELEMENT", props: { nodeValue: "bar" } }]
        }
      },
      {
        type: "span",
        props: {
          onClick: e => alert("Hi"),
          children: [{ type: "TEXT_ELEMENT", props: { nodeValue: "click me" } }]
        }
      }
    ]
  }
};

有了JSX這個(gè)語(yǔ)法糖之后我們就可以使用下面這個(gè)方法來(lái)創(chuàng)建和上面一樣的元素:

const element = (
  
bar alert("Hi")}>click me
);

如果你對(duì)JSX不熟悉你可以能會(huì)想上面這段代碼是個(gè)無(wú)效的JS對(duì)象-----沒(méi)錯(cuò),你想的是對(duì)的。為了讓瀏覽器能解析JSX,我們需要使用預(yù)處理器(比如babel,想對(duì)JSX有更多了解的可以看這里)來(lái)將JSX轉(zhuǎn)換一下。例如babel會(huì)將上面的JSX轉(zhuǎn)成下面這個(gè)樣子:

const element = createElement(
  "div",
  { id: "container" },
  createElement("input", { value: "foo", type: "text" }),
  createElement(
    "a",
    { href: "/bar" },
    "bar"
  ),
  createElement(
    "span",
    { onClick: e => alert("Hi") },
    "click me"
  )
);

剩下我們要做的就是添加一個(gè)createElement方法來(lái)讓Didact支持JSX,其他的工作就可以交給預(yù)處理器了。createElement方法的第一個(gè)參數(shù)是元素的類型type,第二個(gè)參數(shù)是元素的props對(duì)象,剩下的其他參數(shù)就是children了。createElement方法會(huì)返回帶有type屬性和props屬性的對(duì)象,props屬性值也是一個(gè)對(duì)象,該對(duì)象含有第二個(gè)參數(shù)的所有屬性,第二個(gè)參數(shù)之后的其他參數(shù)會(huì)放在一個(gè)數(shù)組中,并作為該對(duì)象的children屬性值。來(lái)實(shí)現(xiàn)一下createElement方法:

function createElement(type, config, ...args){
    const props = Object.assign({}, config);
    const hasChildren = args.length > 0;
    props.children = hasChildren ? [].concat(...args) : [];
    return {type, props}
}

上面的createElement在不碰到文本元素時(shí)都能很好的工作。遇到文本元素時(shí),文本內(nèi)容會(huì)以字符串形式在第二個(gè)參數(shù)之后傳遞給createElement。又因?yàn)槲覀冎岸x了文本元素也需要有typeprops屬性,所以我們會(huì)將剛傳進(jìn)來(lái)的字符串轉(zhuǎn)成一個(gè)文本元素。

const TEXT_ELEMENT = "TEXT_ELEMENT";

function createElement(type, config, ...args){
    const props = Object.assign({}, config);
    const hasChildren = args.length > 0;
    const rawChildren = hasChildren ? [].concat(...args) : [];
    props.children = rawChildren.filter(c => c != null && c !== false)
        .map(c => c instanceof Object ? c : createTextElement(c));
    return { type, props };
}

function createTextElement(value){
    return createElement(TEXT_ELEMENT, { nodeValue: value});
}

上面代碼排除了子元素為null, undefinedfalse的情況。這些情況都是沒(méi)必要渲染的,所以也不需要添加到props.children上。

Summary

這一節(jié)我們依然沒(méi)有添加主功能到Didact上,但現(xiàn)在我們已經(jīng)開(kāi)始使用JSX來(lái)創(chuàng)建元素了,這大幅提升了開(kāi)發(fā)體驗(yàn)。我已經(jīng)將上節(jié)和本節(jié)的代碼在codepen上更新了。代碼頭部的注釋/** @jsx crerateElement8/告訴了babel去使用createElement來(lái)轉(zhuǎn)義JSX。

你也可以在這里查看代碼。

下一節(jié)我們將往Didact中加入虛擬DOM和用來(lái)支持更新操作的一致性校驗(yàn)算法。

下一節(jié)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99668.html

相關(guān)文章

  • React官網(wǎng)RECENT POSTS閱讀

    摘要:事件行為在瀏覽器中保持一次,并且符合標(biāo)準(zhǔn)。主要是進(jìn)行修復(fù)。事件已經(jīng)在移動(dòng)上支持。阻止已經(jīng)在上存在的事件錯(cuò)誤處理。然后對(duì)應(yīng)的將會(huì)被打包送往客戶端。在中棄用,現(xiàn)在正式刪除。是運(yùn)行于一個(gè)嚴(yán)格的安全策略下成為可能。增加警告提示非生產(chǎn)環(huán)境。 ??寫(xiě)在開(kāi)頭 閱讀React官網(wǎng)的 RECENT POSTS的個(gè)人翻譯/摘要(部分)。 英文片段為官網(wǎng)原文片段。 原文地址 ??為什么要使用React ...

    Sike 評(píng)論0 收藏0
  • JavaScript 是如何工作:編寫(xiě)自己 Web 開(kāi)發(fā)框架 + React 及其虛擬 DOM

    摘要:與大多數(shù)全局對(duì)象不同,沒(méi)有構(gòu)造函數(shù)。為什么要設(shè)計(jì)更加有用的返回值早期寫(xiě)法寫(xiě)法函數(shù)式操作早期寫(xiě)法寫(xiě)法可變參數(shù)形式的構(gòu)造函數(shù)一般寫(xiě)法寫(xiě)法當(dāng)然還有很多,大家可以自行到上查看什么是代理設(shè)計(jì)模式代理模式,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 19 篇。 如果你錯(cuò)過(guò)了前面的章節(jié),可以在這里找到它們: 想閱讀更多優(yōu)質(zhì)文章請(qǐng)...

    余學(xué)文 評(píng)論0 收藏0
  • React入門(mén)0x003:jsx 和自由組件

    摘要:概述說(shuō)起來(lái),我喜歡的還是他的思想,在中,實(shí)際上沒(méi)有的區(qū)別,全部都是,就和一樣,可以將所有的資源等同視之。但是這時(shí)候又出來(lái)說(shuō),我要把寫(xiě)在中,真是煩透咯不過(guò),這種東西不過(guò)是年一輪回,就和時(shí)尚一樣。 0x000 概述 說(shuō)起來(lái)react,我喜歡的還是他的思想,在react中,實(shí)際上沒(méi)有html、css、js的區(qū)別,全部都是js,就和webpack一樣,可以將所有的資源等同視之。但是這在一開(kāi)始,...

    eechen 評(píng)論0 收藏0
  • 說(shuō)說(shuō)對(duì)JSX認(rèn)識(shí)

    摘要:認(rèn)識(shí)引子最近幾個(gè)月做的一個(gè)項(xiàng)目,使用了技術(shù)體系,自然而然的用到了。下面就總結(jié)一下自己對(duì)的認(rèn)識(shí)。而這無(wú)疑增加了框架的門(mén)檻和復(fù)雜度。在被渲染之前,所有的數(shù)據(jù)都被轉(zhuǎn)義成為了字符串處理。以避免跨站腳本攻擊。表示對(duì)象將編譯成調(diào)用。 JSX認(rèn)識(shí) 引子 最近幾個(gè)月做的一個(gè)項(xiàng)目,使用了react技術(shù)體系,自然而然的用到了JSX。下面就總結(jié)一下自己對(duì)JSX的認(rèn)識(shí)。 什么是JSX 即JavaScript...

    clasnake 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<