亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

使用React 應(yīng)當(dāng)注意的幾個(gè)地方

高璐 / 1300人閱讀

摘要:都會(huì)造成錯(cuò)誤,注意一定一定嚴(yán)格的用,所以我建議直接復(fù)制我的。因?yàn)橛玫脑捤麜?huì)轉(zhuǎn)義代碼,寫(xiě)不寫(xiě)其實(shí)一個(gè)樣。不可避免的,構(gòu)建肯定是要用到的。這個(gè)時(shí)候一般用的是在外面保存然后里面調(diào)用第二個(gè)坑更隱蔽。

目標(biāo)人群

獻(xiàn)給熟悉基礎(chǔ)的React語(yǔ)法的剛接觸React的同學(xué)~

如果你已經(jīng)寫(xiě)過(guò)半年以上的React那也不用看了,畢竟我水平并不高

What"s React

React 是一個(gè)不存在的網(wǎng)絡(luò)公司Facebook出的JavaScript視圖框架。

他們官網(wǎng)寫(xiě)著

JUST THE UI

VIRTUAL DOM

DATA FLOW

這三個(gè)特性。

當(dāng)我第一次看到的時(shí)候在想,這丫的弱爆了,人家動(dòng)輒就MVC,MVVM的框架,你竟然只寫(xiě)了一個(gè)UI?

當(dāng)然,當(dāng)時(shí)我的想法肯定是錯(cuò)的。

React擁有非常高的性能,結(jié)合單向數(shù)據(jù)流還有組件化思想,可以很舒服的做出現(xiàn)代化的前端產(chǎn)品。

Start

首先,得有開(kāi)發(fā)環(huán)境。

Node的安裝推薦用nvm,我在上一篇《編譯我的開(kāi)發(fā)環(huán)境》里有寫(xiě)。

主要是在項(xiàng)目里得加入編譯jsx到正常的js

$ npm install --save gulp browserify babelify vinyl-source-stream babel-core

gulpfile.babel.js里加上任務(wù)

import gulp from "gulp";
import browserify from "browserify";
import babelify from "babelify";
import source from "vinyl-source-stream";

gulp.task("jsx", () => {
  return browserify("src/app.js")
    .transform(babelify.configure({
        stage:0
    }))
    .bundle()
    .pipe(source("bundle.js"))
    .pipe(gulp.dest("dist/"));
});

這樣,開(kāi)發(fā)環(huán)境就大功告成了。

然而,然而。

起初的時(shí)候要寫(xiě)React這種代碼是比較痛苦的。

平常就是寫(xiě)HTML,然后主要通過(guò)jQuery調(diào)整頁(yè)面,完成一些顯示的功能。

而React是強(qiáng)迫組件化,強(qiáng)制性的用組件化來(lái)構(gòu)造前端。

這里寫(xiě)我的Live template吧,直接復(fù)制粘貼到WebStorm就可以啦

import React from "react";

class $className$ extends React.Component {

  render() {
    return (
        $content$
      );
  }
}

export default $className$;
ES2015

看到這里,如果同學(xué)你不熟悉ES2015的語(yǔ)法可能就感覺(jué)看不懂這是什么了,這還是JavaScript么?

如果真的對(duì)ES2015語(yǔ)法不太熟悉,可以看看阮一峰老師的書(shū):ECMAScript 6入門(mén)

我非常的喜歡ES6的語(yǔ)法,因?yàn)閷?xiě)起來(lái)非常的清晰明了??粗娣?/p>

只是絕大部分瀏覽器現(xiàn)在并不能完全支持ES6,所以需要babel轉(zhuǎn)義。

上面的gulp的jsx task就是完成這樣的轉(zhuǎn)義。

Spelling Component

這個(gè)問(wèn)題和中文有關(guān)。

當(dāng)初我因?yàn)橛⑽牟贿^(guò)關(guān),老是把Component寫(xiě)成Components或者component或者components

這幾種都是不行的。都會(huì)造成錯(cuò)誤,注意一定一定嚴(yán)格的用Component,所以我建議直接復(fù)制我的Live template。

Use strict

其實(shí)挺糾結(jié)的。因?yàn)橛胋abel的話他會(huì)轉(zhuǎn)義代碼,寫(xiě)不寫(xiě)"use strict"其實(shí)一個(gè)樣。

然而我還是建議加上"use strict"。

如果放棄babel,那么我們也可以寫(xiě)出嚴(yán)格的js代碼,這樣多好。

bind(this)

這里有些很奇怪的問(wèn)題。有一些情況下這樣寫(xiě)會(huì)出錯(cuò)

class App extends React.Component {

  handleChange(e) {
    console.log(this);
  }

  render() {
    return (
      
    );
  }
}

對(duì),這個(gè)this,有時(shí)候不知道為什么this指向就會(huì)變。

如果你碰到了這樣的問(wèn)題,可能加一個(gè)綁定當(dāng)前this會(huì)有效:

這個(gè)問(wèn)題并沒(méi)有深究,留待再碰到再解決吧。

Ajax

不可避免的,構(gòu)建SPA肯定是要用到Ajax的。

我有時(shí)候也想用fetch,但是,這次我慫了。 瀏覽器兼容性實(shí)在是太差了。

chrome 42 才支持。不能指望其他瀏覽器跟上了。

言歸正傳,一般情況下Ajax數(shù)據(jù)是要傳到state里面的,所以一般是這樣的:

class App extends React.Component {

  fetchSomething() {
    $.ajax({
      url: "http://foo.com",
      dataType: "json",
      method: "GET",
      success: function(res) {
        this.setState({ res: res });
        }
      });
  }

  render() {
    return (...);
  }
}

如果你真的這樣寫(xiě),恭喜你,你會(huì)碰到兩個(gè)坑!

一個(gè)是this,在success中的this指向可是XMLHttpRequest的對(duì)象哦,并不是App 的class。這個(gè)時(shí)候一般用的是在外面保存this,然后里面調(diào)用

let that = this;

that.setState({});

第二個(gè)坑更隱蔽。我當(dāng)初愣是沒(méi)想起來(lái)。

異步

即使經(jīng)常寫(xiě)原生js也很容易忽視這個(gè)問(wèn)題。

ajax請(qǐng)求默認(rèn)是異步的,也就是說(shuō),數(shù)據(jù)尚未傳送到客戶端的時(shí)候,js就已經(jīng)跑完了客戶端的所有代碼(好幾遍)。V8那個(gè)效率,你懂的。

問(wèn)題來(lái)了。數(shù)據(jù)沒(méi)有到,那么this.setState也就沒(méi)有觸發(fā),那么后面用數(shù)據(jù)怎么辦?

GG

好了,既然原理知道了,那么解決方法也就很簡(jiǎn)單了,在Ajax請(qǐng)求的時(shí)候改成同步的

$.ajax({
  url: "/foo/bar",
  dataType: "json",
  async: false,
  success: function(res){
    this.setState({res});
  }
});

這里也就造成了一個(gè)問(wèn)題,Ajax請(qǐng)求在了主線程上。網(wǎng)絡(luò)堵塞就完蛋了。。。額,再說(shuō)吧。

constructor

constructor是ES6的class的構(gòu)造函數(shù),在React中用處非常的大

class App extends React.Component {
  constructor(props) {
    super(props);

    // do something

    this.state = {
      author: "Annatar"
    }
  }

  render() {
    return (...);
  }
}

構(gòu)造函數(shù)必須傳入props,并且在第一行就得首先調(diào)用父類(lèi)的構(gòu)造函數(shù)。

state的設(shè)置在constructor中并不是setState了,而是變成了賦值。就像上面的那樣

我就在constructor中調(diào)用Ajax。。。

Props

這個(gè)是深坑啊。埋了我好長(zhǎng)時(shí)間。。。

你要是老老實(shí)實(shí)跟著官網(wǎng)寫(xiě)props,就像這樣

class App extends React.Component {

  static PropTypes = {
    url: React.PropTypes.string.isRequired
  }

  static defaultProps = {
    url: "/foo/bar"
  }

  render() {
    return (...);
  }
}

哈哈,正常情況是會(huì)報(bào)錯(cuò)的!

我經(jīng)過(guò)查資料才得知static目前是ES7草案上的屬性,但是React官方已經(jīng)推薦用了。

默認(rèn)的babel并沒(méi)有開(kāi)啟ES7的轉(zhuǎn)義。所以會(huì)報(bào)錯(cuò),不認(rèn)識(shí)。

所以我在gulp配置文件中把babelify的stage改成了0.表示所有屬性都用,

然后就通過(guò)了

React-dom

我目前碰到的最深的坑,沒(méi)有之一。

我記得之前的寫(xiě)法是React.render(, document.body),嗯,挺正常的。好

后來(lái)升級(jí)到0.14.0,要引入react-dom,寫(xiě)成這樣也挺好的:

import ReactDOM from "react-dom";

import App from "./app";
ReactDOM(, document.body);

嗯,挺好的??粗诲e(cuò)嘛。

但是。。。為毛小版本的升級(jí)0.14.2就要換成ReactDOM.render!

最坑的是react-router這個(gè)項(xiàng)目里面的readme里寫(xiě)的是錯(cuò)誤的寫(xiě)法!(現(xiàn)在是正確的)

我當(dāng)時(shí)困惑了足足兩個(gè)小時(shí)。后來(lái)哪里都確定了沒(méi)有問(wèn)題。就是找不出原因,后來(lái)就輸出ReactDOM才發(fā)現(xiàn)里面丫的藏著一個(gè)render方法。這才正確。

一定記得,多看文檔。注意,注意,注意,千萬(wàn)只看官方的文檔,其他的誰(shuí)都不可靠!

import ReactDOM from "react-dom";
// import {render} from "react-dom"; 也行

import App from "./app";
ReactDOM.render(, document.body);
// render(, document.body);
react-router

上面講了react-router的坑爹文檔。這里得說(shuō)說(shuō)react-router的坑爹版本號(hào)

安裝的時(shí)候千萬(wàn)別懶省事,不然就直接拷貝:

$ npm install --save history react-router@latest

我當(dāng)時(shí)就是懶得打最后的@latest,導(dǎo)致怎么都沒(méi)辦法顯示效果。也是找了大半天的問(wèn)題。后來(lái)才發(fā)現(xiàn)Router是undefined

別懶省事就成了。

Others

關(guān)于Flux理解不夠深,也沒(méi)有用。

反正我現(xiàn)在看到react-router就后背涼颼颼的。Redux也是這老大做的吧。感覺(jué)菊花一緊。。。

下一步

從一開(kāi)始的別扭,到現(xiàn)在不寫(xiě)React的別扭,轉(zhuǎn)變其實(shí)還是蠻大的。

關(guān)于React的探索,這里并不是終點(diǎn)。

其他的,動(dòng)畫(huà),F(xiàn)lux,React-Native,Meteor都是未來(lái)要研究的東西。

好好學(xué)習(xí)吧,少年~

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

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

相關(guān)文章

  • 01.react入門(mén)必備,知識(shí)點(diǎn)梳理,生命周期全講解

    摘要:生命周期在版本中引入了機(jī)制。以后生命周期圖解不包含官方不建議使用的事件處理事件的命名采用小駝峰式,而不是純小寫(xiě)。只是在兄弟節(jié)點(diǎn)之間必須唯一受控組件使的成為唯一數(shù)據(jù)源。 react 基礎(chǔ) JSX JSX是一個(gè) JavaScript 的語(yǔ)法擴(kuò)展,可以很好地描述 UI 應(yīng)該呈現(xiàn)出它應(yīng)有交互的本質(zhì)形式。 React DOM 在渲染所有輸入內(nèi)容之前,默認(rèn)會(huì)進(jìn)行轉(zhuǎn)義。它可以確保在你的應(yīng)用中,永遠(yuǎn)...

    Jiavan 評(píng)論0 收藏0
  • 利用react-redux-tpl快速開(kāi)發(fā)react-redux-webpack項(xiàng)目

    摘要:將它開(kāi)源出來(lái),希望能給某些同學(xué)帶來(lái)幫助,如果有設(shè)計(jì)的不好的地方,也希望能及時(shí)指出,共同進(jìn)步。和為組件,下的文件一般為直接配合路由使用的包裝組件,為具體業(yè)務(wù)組件,這個(gè)地方有的規(guī)范將組件分為三層,我個(gè)人認(rèn)為這個(gè)必要性不大。 個(gè)人學(xué)習(xí)使用react已經(jīng)有一段時(shí)間了,雖然沒(méi)有在真正的產(chǎn)品項(xiàng)目中大規(guī)模使用react,但是在自己的博客、小網(wǎng)站、一些開(kāi)源項(xiàng)目中已經(jīng)使用過(guò)好幾次了,使用react創(chuàng)建項(xiàng)...

    X1nFLY 評(píng)論0 收藏0
  • 最近想通幾個(gè)單頁(yè)面應(yīng)用開(kāi)發(fā)的重點(diǎn)

    摘要:老實(shí)說(shuō)我不是第一次想歪了而且很慢總是不能很快抓住要點(diǎn)當(dāng)別人用后端從做博客做論壇聯(lián)系完成的應(yīng)用的時(shí)候我跑去學(xué)單頁(yè)面應(yīng)用還很久掙扎在的思路當(dāng)中我想說(shuō)的是走大多數(shù)人走的路的確是可以減少浪費(fèi)的時(shí)間和錯(cuò)誤的走少數(shù)人在的路當(dāng)然也刺激的我最近才明白原來(lái)前 老實(shí)說(shuō)我不是第一次想歪了, 而且很慢, 總是不能很快抓住要點(diǎn). 當(dāng)別人用后端 MVC 從做博客做論壇, 聯(lián)系完成 MVC 的應(yīng)用的時(shí)候 我跑去學(xué)單...

    yibinnn 評(píng)論0 收藏0
  • 如何構(gòu)建大型的前端項(xiàng)目

    摘要:如何構(gòu)建大型的前端項(xiàng)目搭建好項(xiàng)目的腳手架一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。組件化一般分為項(xiàng)目?jī)?nèi)的組件化和項(xiàng)目外的組件化。 如何構(gòu)建大型的前端項(xiàng)目 1. 搭建好項(xiàng)目的腳手架 一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。一般腳手架都應(yīng)當(dāng)有以下的幾個(gè)功能: 自動(dòng)化構(gòu)建代碼,比如打包、壓縮、上傳等功能 本地開(kāi)發(fā)與調(diào)試,并有熱替換與...

    lykops 評(píng)論0 收藏0
  • 如何構(gòu)建大型的前端項(xiàng)目

    摘要:如何構(gòu)建大型的前端項(xiàng)目搭建好項(xiàng)目的腳手架一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。組件化一般分為項(xiàng)目?jī)?nèi)的組件化和項(xiàng)目外的組件化。 如何構(gòu)建大型的前端項(xiàng)目 1. 搭建好項(xiàng)目的腳手架 一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。一般腳手架都應(yīng)當(dāng)有以下的幾個(gè)功能: 自動(dòng)化構(gòu)建代碼,比如打包、壓縮、上傳等功能 本地開(kāi)發(fā)與調(diào)試,并有熱替換與...

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

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

0條評(píng)論

高璐

|高級(jí)講師

TA的文章

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