国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React系列之 React入門

pf_miles / 362人閱讀

摘要:原文地址是一個庫,主要是通過操作數(shù)據(jù)的方式去操縱,為什么要重造輪子呢,因為覺的目前市面上的框架對于創(chuàng)建大型應(yīng)用程序不夠直觀,不能滿足需求,所以誕生了。其實說它性能高,只不過是用的方式計算出最小的操作,所以性能就上來了。

原文地址:https://gmiam.com/post/react-...

React 是一個 JS 庫,主要是通過操作數(shù)據(jù)的方式去操縱 DOM,為什么要重造輪子呢,因為 FB 覺的目前市面上的 MV* 框架對于創(chuàng)建大型應(yīng)用程序不夠直觀,不能滿足需求,所以誕生了 React。

React 現(xiàn)在官方的介紹是 Declarative、Component-Based、Learn Once, Write Anywhere,其實開始推出時主要的特色是 Virtual DOM,因為 DOM 操作總是很慢的,而 JS 的性能日趨向上,所以 React 內(nèi)部用 JS 維護一顆 DOM 樹,每次數(shù)據(jù)變了從新生成一顆樹與之前的做對比,把實際變化的地方應(yīng)用到真實的 DOM 上。其實說它性能高,只不過是用 JS 的方式計算出最小的 DOM 操作,所以性能就上來了。

說到這里我們實際操作下吧,這里假設(shè)你熟悉 node、babel、webpack 方式,當(dāng)然你也可以選擇你喜好的方式 傳送門

首先創(chuàng)建目錄結(jié)構(gòu)

react-demo

    .babelrc

    index.html

    src
        app.js

index.html



  
    
    
    React App
  
  
    

app.js

var React = require( "react" )
var ReactDOM = require( "react-dom" )

var HelloMessage = React.createClass( {
    render: function () {
        return 
Hello {this.props.name}
} }) ReactDOM.render( , document.getElementById( "app" ) )

.babelrc

{ "presets": ["es2015","react"] }

安裝依賴 npm install --save react react-dom babel-preset-react babel-loader babel-core

編譯監(jiān)聽 webpack src/app.js bundle.js -w --module-bind "js=babel"

打開 index.html 查看效果

先說下 jsx 語法,React 讓你不需要再寫 html 拼接字符等操作,而是直接寫 html,js 處理放到 { } 里書寫,官方提供 jsx 語法非必要,也可以脫離寫純 js 的,如上面的經(jīng)過編譯后

"use strict";

var HelloMessage = React.createClass({
  displayName: "HelloMessage",

  render: function render() {
    return React.createElement(
      "div",
      null,
      "Hello ",
      this.props.name
    );
  }
});

ReactDOM.render(React.createElement(HelloMessage, { name: "John" }), document.getElementById( "app" ));

但是可以看出這么麻煩沒人去手寫的

再來說下組件,React 的概念就是給應(yīng)用分層,創(chuàng)建一個個組件,最后拼出一個頁面,組件方便后期的維護、擴展、以及再重用,隨著組件的越多后面寫的代碼越少,來個例子

var Avatar = React.createClass({
  render: function() {
    return (
      
); } }); var PagePic = React.createClass({ render: function() { return ( ); } }); var PageLink = React.createClass({ render: function() { return ( {this.props.pagename} ); } }); ReactDOM.render( , document.getElementById("app") );

可以看到組件要提供自己的 render 方法,組件可以相互嵌套,數(shù)據(jù)通過 this.props 單向傳遞

同時需要注意

屬性 class 要寫成 className,for 寫成 htmlFor,因為它們是 js 的保留字

對于render 返回的內(nèi)容只能有一個頂級標簽,如果標簽超過多行要用 ( ) 包含

關(guān)于 props 不要去改變它,會導(dǎo)致一些不可預(yù)知的問題,另外官方推薦用 es6 的 ... 操作符去掛載屬性

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

這里有個特殊屬性 this.props.children,來個例子

var NotesList = React.createClass({
  propTypes: {
        children: React.PropTypes.array.isRequired,
  },
  render: function() {
    return (
      
    { React.Children.map(this.props.children, function (child) { return
  1. {child}
  2. ; }) }
); } }); ReactDOM.render( hello world , document.getElementById("app") );

同時可以看到這里提供了 propTypes 可以給屬性做檢查,驗證說明 children 必須提供且是一個數(shù)組(多個),更多的類型驗證可以 看這里

前面創(chuàng)建組件都是通過 React.createClass ,可以通過 es6 class 語法

class HelloMessage extends React.Component {
  render() {
    return 
Hello {this.props.name}
; } } ReactDOM.render(, document.getElementById("app"));

還有 Stateless Functions 方式

function HelloMessage(props) {
  return 
Hello {props.name}
; } ReactDOM.render(, document.getElementById("app"));

官方推薦盡量寫 stateless functions ,因為未來會優(yōu)化這些來避免無用的檢查和內(nèi)存分配

下面看下如何寫事件

var Input = React.createClass({
  getInitialState: function() {
    return {value: "Hello!"};
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function () {
    var value = this.state.value;
    return (
      

{value}

); } }); ReactDOM.render(, document.getElementById("app"));

駱駝式的 on 語法即可監(jiān)聽事件,事件是標準的跨瀏覽器的事件,雖然內(nèi)聯(lián)寫法,但是是委托實現(xiàn)的~

說到了事件交互可能就要設(shè)及獲取真實的 dom 節(jié)點,React 通過 ref 設(shè)置,來個例子

var React = require( "react" )
var ReactDOM = require( "react-dom" )

var MyComponent = React.createClass({
  handleClick: function() {
    this.refs["myinput"].focus()
  },
  render: function() {
    return (
      
); } }); ReactDOM.render( , document.getElementById("app") );

ref 字符屬性的方式未來會被廢棄,官方推薦使用 ref callback 方式

var MyComponent = React.createClass({
  handleClick: function() {
    if (this.myTextInput !== null) {
      this.myTextInput.focus();
    }
  },
  render: function() {
    return (
      
this.myTextInput = ref} />
); } }); ReactDOM.render( , document.getElementById("app") );

說到這里看下組件的生命周期與如何更新,還是來個例子

var Timer = React.createClass({
  getInitialState: function() {
    return {secondsElapsed: 0};
  },
  tick: function() {
    this.setState({secondsElapsed: this.state.secondsElapsed + 1});
  },
  componentDidMount: function() {
    this.interval = setInterval(this.tick, 1000);
  },
  componentWillUnmount: function() {
    clearInterval(this.interval);
  },
  render: function() {
    return (
      
Seconds Elapsed: {this.state.secondsElapsed}
); } }); ReactDOM.render(, document.getElementById("app"));

生命周期有三個主要部分

Mounting 插入 dom

getInitialState()

componentWillMount()

componentDidMount ()

Updating 重新渲染

componentWillReceiveProps(object nextProps)

shouldComponentUpdate(object nextProps, object nextState)

componentWillUpdate(object nextProps, object nextState)

componentDidUpdate(object prevProps, object prevState)

Unmounting 移除 dom

componentWillUnmount()

周期提供了 will 方法在事情發(fā)生之前調(diào)用, did 方法在事情法神之后調(diào)用,具體查看這里

對于更新,上面的例子在組件 componentDidMount (插入 dom 后) hook 中定時更新組件的 state,state變更會導(dǎo)致 render 重新渲染頁面

對于這里說下性能問題,雖然虛擬dom計算過程很快,但是很多時候我們可以避免它的計算以更好的優(yōu)化處理

例如 一個組件的更新可能會導(dǎo)致它的子組件一起跟著更新,子組件很可能沒有變化,但同樣會進行一次diff運算,白白浪費了時間,所以 React 提供了 shouldComponentUpdate 鉤子函數(shù),默認是直接返回 true,也及是每次都運算比較,所以我們可以在這里優(yōu)化,來個例子

React.createClass({
  propTypes: {
    value: React.PropTypes.string.isRequired
  },
  shouldComponentUpdate: function(nextProps, nextState) {
      return this.props.value !== nextProps.value;
  },
  render: function() {
    return 
{this.props.value}
; } });

這里只有 value 變化的時候在重新渲染計算,否則直接跳過

對于上面的淺對比,React 提供了通用解決方案 PureRenderMixin 擴展,應(yīng)用 React 的 mixins 功能即可自動實現(xiàn)處理比對

var PureRenderMixin = require("react-addons-pure-render-mixin");
React.createClass({
  mixins: [PureRenderMixin],

  render: function() {
     return 
{this.props.value}
; } });

但是如果有深層結(jié)構(gòu),上面的處理可能不會按預(yù)期工作,例如

//  this.props.value 的值為 { foo: "bar" }
// nextProps.value 的值為 { foo: "bar" },
// 但是對象的引用不同,導(dǎo)致不會相等
this.props.value !== nextProps.value; // true

而且如果我們不小心管理引用的話也會引發(fā)另一些問題,例如這個組件有一個父組件

React.createClass({
  getInitialState: function() {
    return { value: { foo: "bar" } };
  },

  onClick: function() {
    var value = this.state.value;
    value.foo += "bar"; // ANTI-PATTERN!
    this.setState({ value: value });
  },

  render: function() {
    return (
      
    );
  }
});

首先內(nèi)部組件得到 { foo: "bar" },點擊后出發(fā) value 更新 { foo: "barbar" },觸發(fā) re-rendering 程序,內(nèi)部組件將會得到 { foo: "barbar" },但是 this.props.value 與 nextProps.value 指向同一個引用,導(dǎo)致任何時候比對都是 true,而導(dǎo)致頁面不更新

而且如果父組件應(yīng)用 PureRenderMixin 的話,由于改動相同引用所以也會導(dǎo)致父組件的 re-rendering 不觸發(fā)

那最后該如何處理呢?請看下一篇 Immutable-js 來解救你~

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80396.html

相關(guān)文章

  • React入門腳手架搭建項目

    摘要:前言寫此系列博客的目的是對所學(xué)知識點的總結(jié)和梳理,包括填坑方案分享,希望能幫助到還并不會使用的開發(fā)者入門官方文檔中文文檔社區(qū)項目搭建按照官方提供的搭建項目全局安裝或全局安裝后可以使用這條命令創(chuàng)建名為的項目啟動 前言 寫此系列博客的目的是對所學(xué)React知識點的總結(jié)和梳理,包括填坑方案分享,希望能幫助到還并不會使用React的開發(fā)者入門React React官方文檔React中文文檔R...

    BingqiChen 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    muddyway 評論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...

    princekin 評論0 收藏0

發(fā)表評論

0條評論

pf_miles

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<