摘要:都會造成錯誤,注意一定一定嚴格的用,所以我建議直接復制我的。因為用的話他會轉義代碼,寫不寫其實一個樣。不可避免的,構建肯定是要用到的。這個時候一般用的是在外面保存然后里面調用第二個坑更隱蔽。
目標人群
獻給熟悉基礎的React語法的剛接觸React的同學~
如果你已經寫過半年以上的React那也不用看了,畢竟我水平并不高
What"s ReactReact 是一個不存在的網絡公司Facebook出的JavaScript視圖框架。
他們官網寫著
JUST THE UI
VIRTUAL DOM
DATA FLOW
這三個特性。
當我第一次看到的時候在想,這丫的弱爆了,人家動輒就MVC,MVVM的框架,你竟然只寫了一個UI?
當然,當時我的想法肯定是錯的。
React擁有非常高的性能,結合單向數據流還有組件化思想,可以很舒服的做出現代化的前端產品。
Start首先,得有開發環境。
Node的安裝推薦用nvm,我在上一篇《編譯我的開發環境》里有寫。
主要是在項目里得加入編譯jsx到正常的js
$ npm install --save gulp browserify babelify vinyl-source-stream babel-core
在gulpfile.babel.js里加上任務
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/")); });
這樣,開發環境就大功告成了。
然而,然而。
起初的時候要寫React這種代碼是比較痛苦的。
平常就是寫HTML,然后主要通過jQuery調整頁面,完成一些顯示的功能。
而React是強迫組件化,強制性的用組件化來構造前端。
這里寫我的Live template吧,直接復制粘貼到WebStorm就可以啦
import React from "react"; class $className$ extends React.Component { render() { return ( $content$ ); } } export default $className$;ES2015
看到這里,如果同學你不熟悉ES2015的語法可能就感覺看不懂這是什么了,這還是JavaScript么?
如果真的對ES2015語法不太熟悉,可以看看阮一峰老師的書:ECMAScript 6入門
我非常的喜歡ES6的語法,因為寫起來非常的清晰明了。看著舒服。
只是絕大部分瀏覽器現在并不能完全支持ES6,所以需要babel轉義。
上面的gulp的jsx task就是完成這樣的轉義。
Spelling Component這個問題和中文有關。
當初我因為英文不過關,老是把Component寫成Components或者component或者components。
這幾種都是不行的。都會造成錯誤,注意一定一定嚴格的用Component,所以我建議直接復制我的Live template。
Use strict其實挺糾結的。因為用babel的話他會轉義代碼,寫不寫"use strict"其實一個樣。
然而我還是建議加上"use strict"。
如果放棄babel,那么我們也可以寫出嚴格的js代碼,這樣多好。
bind(this)這里有些很奇怪的問題。有一些情況下這樣寫會出錯
class App extends React.Component { handleChange(e) { console.log(this); } render() { return ( ); } }
對,這個this,有時候不知道為什么this指向就會變。
如果你碰到了這樣的問題,可能加一個綁定當前this會有效:
這個問題并沒有深究,留待再碰到再解決吧。
Ajax不可避免的,構建SPA肯定是要用到Ajax的。
我有時候也想用fetch,但是,這次我慫了。 瀏覽器兼容性實在是太差了。
chrome 42 才支持。不能指望其他瀏覽器跟上了。
言歸正傳,一般情況下Ajax數據是要傳到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 (...); } }
如果你真的這樣寫,恭喜你,你會碰到兩個坑!
一個是this,在success中的this指向可是XMLHttpRequest的對象哦,并不是App 的class。這個時候一般用的是在外面保存this,然后里面調用
let that = this; that.setState({});
第二個坑更隱蔽。我當初愣是沒想起來。
異步
即使經常寫原生js也很容易忽視這個問題。
ajax請求默認是異步的,也就是說,數據尚未傳送到客戶端的時候,js就已經跑完了客戶端的所有代碼(好幾遍)。V8那個效率,你懂的。
問題來了。數據沒有到,那么this.setState也就沒有觸發,那么后面用數據怎么辦?
GG
好了,既然原理知道了,那么解決方法也就很簡單了,在Ajax請求的時候改成同步的
$.ajax({ url: "/foo/bar", dataType: "json", async: false, success: function(res){ this.setState({res}); } });
這里也就造成了一個問題,Ajax請求在了主線程上。網絡堵塞就完蛋了。。。額,再說吧。
constructorconstructor是ES6的class的構造函數,在React中用處非常的大
class App extends React.Component { constructor(props) { super(props); // do something this.state = { author: "Annatar" } } render() { return (...); } }
構造函數必須傳入props,并且在第一行就得首先調用父類的構造函數。
state的設置在constructor中并不是setState了,而是變成了賦值。就像上面的那樣
我就在constructor中調用Ajax。。。
Props這個是深坑啊。埋了我好長時間。。。
你要是老老實實跟著官網寫props,就像這樣
class App extends React.Component { static PropTypes = { url: React.PropTypes.string.isRequired } static defaultProps = { url: "/foo/bar" } render() { return (...); } }
哈哈,正常情況是會報錯的!
我經過查資料才得知static目前是ES7草案上的屬性,但是React官方已經推薦用了。
默認的babel并沒有開啟ES7的轉義。所以會報錯,不認識。
所以我在gulp配置文件中把babelify的stage改成了0.表示所有屬性都用,
然后就通過了
React-dom我目前碰到的最深的坑,沒有之一。
我記得之前的寫法是React.render(
后來升級到0.14.0,要引入react-dom,寫成這樣也挺好的:
import ReactDOM from "react-dom"; import App from "./app"; ReactDOM(, document.body);
嗯,挺好的。看著不錯嘛。
但是。。。為毛小版本的升級0.14.2就要換成ReactDOM.render!
最坑的是react-router這個項目里面的readme里寫的是錯誤的寫法!(現在是正確的)
我當時困惑了足足兩個小時。后來哪里都確定了沒有問題。就是找不出原因,后來就輸出ReactDOM才發現里面丫的藏著一個render方法。這才正確。
一定記得,多看文檔。注意,注意,注意,千萬只看官方的文檔,其他的誰都不可靠!
import ReactDOM from "react-dom"; // import {render} from "react-dom"; 也行 import App from "./app"; ReactDOM.render(react-router, document.body); // render( , document.body);
上面講了react-router的坑爹文檔。這里得說說react-router的坑爹版本號
安裝的時候千萬別懶省事,不然就直接拷貝:
$ npm install --save history react-router@latest
我當時就是懶得打最后的@latest,導致怎么都沒辦法顯示效果。也是找了大半天的問題。后來才發現Router是undefined
別懶省事就成了。
Others關于Flux理解不夠深,也沒有用。
反正我現在看到react-router就后背涼颼颼的。Redux也是這老大做的吧。感覺菊花一緊。。。
下一步從一開始的別扭,到現在不寫React的別扭,轉變其實還是蠻大的。
關于React的探索,這里并不是終點。
其他的,動畫,Flux,React-Native,Meteor都是未來要研究的東西。
好好學習吧,少年~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78275.html
摘要:生命周期在版本中引入了機制。以后生命周期圖解不包含官方不建議使用的事件處理事件的命名采用小駝峰式,而不是純小寫。只是在兄弟節點之間必須唯一受控組件使的成為唯一數據源。 react 基礎 JSX JSX是一個 JavaScript 的語法擴展,可以很好地描述 UI 應該呈現出它應有交互的本質形式。 React DOM 在渲染所有輸入內容之前,默認會進行轉義。它可以確保在你的應用中,永遠...
摘要:將它開源出來,希望能給某些同學帶來幫助,如果有設計的不好的地方,也希望能及時指出,共同進步。和為組件,下的文件一般為直接配合路由使用的包裝組件,為具體業務組件,這個地方有的規范將組件分為三層,我個人認為這個必要性不大。 個人學習使用react已經有一段時間了,雖然沒有在真正的產品項目中大規模使用react,但是在自己的博客、小網站、一些開源項目中已經使用過好幾次了,使用react創建項...
摘要:老實說我不是第一次想歪了而且很慢總是不能很快抓住要點當別人用后端從做博客做論壇聯系完成的應用的時候我跑去學單頁面應用還很久掙扎在的思路當中我想說的是走大多數人走的路的確是可以減少浪費的時間和錯誤的走少數人在的路當然也刺激的我最近才明白原來前 老實說我不是第一次想歪了, 而且很慢, 總是不能很快抓住要點. 當別人用后端 MVC 從做博客做論壇, 聯系完成 MVC 的應用的時候 我跑去學單...
摘要:如何構建大型的前端項目搭建好項目的腳手架一般新開發一個項目時,我們會首先搭建好一個腳手架,然后才會開始寫代碼。組件化一般分為項目內的組件化和項目外的組件化。 如何構建大型的前端項目 1. 搭建好項目的腳手架 一般新開發一個項目時,我們會首先搭建好一個腳手架,然后才會開始寫代碼。一般腳手架都應當有以下的幾個功能: 自動化構建代碼,比如打包、壓縮、上傳等功能 本地開發與調試,并有熱替換與...
摘要:如何構建大型的前端項目搭建好項目的腳手架一般新開發一個項目時,我們會首先搭建好一個腳手架,然后才會開始寫代碼。組件化一般分為項目內的組件化和項目外的組件化。 如何構建大型的前端項目 1. 搭建好項目的腳手架 一般新開發一個項目時,我們會首先搭建好一個腳手架,然后才會開始寫代碼。一般腳手架都應當有以下的幾個功能: 自動化構建代碼,比如打包、壓縮、上傳等功能 本地開發與調試,并有熱替換與...
閱讀 2858·2021-07-30 15:30
閱讀 553·2019-08-30 15:55
閱讀 1621·2019-08-26 17:04
閱讀 632·2019-08-26 11:36
閱讀 2064·2019-08-26 10:58
閱讀 3548·2019-08-23 14:34
閱讀 1557·2019-08-22 18:48
閱讀 2522·2019-08-21 17:51