react學習

 

1.react是Facebook公司開發的最初用於ins的網站搭建css

2.庫和框架的概念html

庫:小而巧  只提供了特定API 能夠很方便的從一個庫換到另外一個庫  代碼幾乎不會改變前端

框架:大而全  框架提供了一整套的解決方案,因此切換到其餘的框架比較困難vue

3.模塊化和組件化及其優勢node

模塊化:從代碼出發分析  把一些可複用的代碼 抽離爲單個的模塊,便於項目的維護和開發react

組件化:從ui出發分析   把一些可複用的ui界面 抽離爲單獨的組件   (隨着項目的開發,組件積累的愈來愈多,很方便就能把現有的組件拼接成完整的頁面)ios

vue如何實現組件化  經過.vue文件建立對應的組件    分紅三部分 template (結構)  script(行爲) style(樣式) 缺一不可程序員

react如何實現組件化   react中有組件化的概念 可是沒有像vue同樣這樣的組件模版文件  一切都已js來表現web

移動開發方向ajax

vue結合weex技術 能夠遷移到移動端   weex技術阿里本身系列軟件在用

react 結合react native 能夠無縫遷移到移動端   大公司用的多

4.react的核心概念

(1).虛擬dom

    dom的本質  瀏覽器的概念 用js對象表示頁面上的元素,瀏覽器提供了操做dom對象的API

    react中的虛擬dom   框架中的概念 是程序員用js對象來模擬 頁面上的dom和dom嵌套

    爲何要實現虛擬dom   爲了實現頁面中dom元素的高效更新

    dom樹的概念  (一個頁面呈現的過程)瀏覽器請求服務器獲取頁面html代碼 -> 瀏覽器要先在內存中,解析dom結構,並在瀏覽器內存中渲染出一棵dom樹 ->瀏覽器把dom樹渲染在頁面上

    如何把性能最優  ->按需更新  如何按需更新  ->獲取內存中的新舊兩棵dom樹進行對比,獲得須要修改的dom元素  如何獲取dom樹 -> 瀏覽器並未提供獲取dom樹的api ->程序員手動模擬dom                   樹 如何模擬dom樹 ->對象與數組結合 var tree = {

                                                                                   tagName:'div',

                                                                                   childrens:[{tagName:'p'},'lalala']

                                                                                   }

          程序員用js對象的方式手動模擬dom樹和嵌套關係 就是虛擬dom   目的:使頁面高效更新

(2).diff算法(different)

tree diff   新舊兩顆dom樹逐層對比的過程,當整棵樹逐層對比結束,則全部須要按需更新的元素都能被找到

component diff  在進行tree diff的時候,每一層中組件級別的對比

                       若對比先後,組件類型相同,則暫時認爲此組件不須要被更新

                       若對比先後,組件的類型不一樣,則須要移除舊組件,建立新組件,並追加到頁面上

element diff     在進行組件對比的時候若出現組件相同,則須要進行元素級別的對比。

5.問題記錄  

在使用react時 初始建立react項目用npm install -g create-react-app   報錯  錯誤信息爲 Error: EACCES  即沒有權限  此時在指令前加sudo便可執行

6.前端思想pwa  progressive web application 

之前端的方式寫手機app  react中的體現  在index.js中有 import registerServerWorker from './ registerServerWorker'   引入以後用戶第一次打開頁面需聯網 以後若在無網絡環境下打開也會顯示聯網時的頁面

manifest.json是在使用pwa時  對首次頁面的緩存  能夠在該頁面設置快捷方式的圖標和網址 顏色等

7.使用react的步驟

sudo npm install -g create-react-app  -> cd Desktop  -> create-react-app +文件名 -> cd 文件名 -> npm start  就會打開新建的頁面  每次調試  npm run start

8.在app.js中  import React, { Component } from 'react';   去掉,{}中的東西  等同於class App extends React.Component這種寫法

  render函數返回什麼  頁面顯示什麼  在用export default +類名 返回出去

9.ES6 解構賦值  ???

10.jsx語法須要引入react

11.jsx語法 

(1).直接在js文件中寫入標籤 無需引號

(2).能夠將自定義的組件以標籤形式引入  注意首字母必須大寫

(3).jsx語法規定 函數返回的標籤羣必須被包裹在一個標籤中

(4).react16提供了Fragment標籤 解決既知足(3)又不想在頁面中顯示最外層標籤的方法

(5).jsx中的變量要用{}包裹

(6).jsx如何寫註釋 {//或者/**/}  是開發時註釋

12.constructor(props)爲類的構造函數 默認有個props參數  在其中執行super(props)  即執行父類的構造函數  構造函數中this.state能夠存放數據

13.事件綁定時須要經過bind(this)改變this指向  state中提供setxxx用來改變state中的值  以傳入對象的形式

14.map???

15.ES6展開運算符

[...this.state.list,xxx]  意味將以前的數組內容拿過來

16.react作循環時,須要在每一個循環中加入key值 不加不報錯 但警告

17.immutable  ->即state不容許咱們作任何修改 若想修改就拷貝個副本  否則以後的性能優化會出現問題

18.jsx 中寫class名時推薦寫成className 由於在該語法下默認class爲類

19.若想達成在input輸入框中加入標籤在頁面中顯示的話,在你想出現的標籤上寫  屬性dangerouslySetInnerHTML = {{__html:item}}  可是可能會被注入攻擊

20.父組件以屬性的方式傳給子組件數據  子組件以this.props.xxx的形式接收

     子組件以父組件傳遞過來的方法傳遞數據給父組件

21.react代碼優化

先引入組件 在引入樣式 

bind(this)的時候能夠拿到頂端寫 提升性能 

新版react對setState 進行修改  以前是對象的形式  新版是函數形式 返回對象  即this.setState(()=>{

return {inputValue:e.target.value}})   但會報錯 報錯緣由是寫成了函數就會出現異步操做 因此要在函數上面用常量保存時間的相關參數

22.ES6return的簡寫是括號

23.setState()能夠接收個參數是prevState  表示上一個state 等同於this.state 

24.react的特色

    聲名式開發   (只操做數據)

    能夠與其餘框架共存

    組件化開發   (組件開頭字母 要大寫)

    單向數據流   (只能父組件向子組件傳值,子組件不能改變父組件傳過來的值)

    視圖層框架   (只處理數據和頁面渲染,其餘複雜組件間的傳值要藉助其餘框架)

    函數式編程   (對前端自動化測試帶來方便)    

25.切換node版本

     npm install -g n

     n 版本號

26.action   

 

是行爲的抽象

是普通js對象

通常由方法是生成

必須有一個type (惟一的)

27.store = reducer + state

 

 

  reducer裏有createstore  會生成store

28.

 

29.總結一下:redux的設計思想簡單的說;
第一步:action :無論三七二之一;模擬出事件;

第二步:reducer:  開發中天然有多個reducer;
新建一個reducer文件只作一件事;吧多個reducer合併成一個reducer.
使用combineReducers方法來將多個reducer合併成一個;每一個reducer會生成一個新的state;將多個reducer合併成一個reducer;那也就等同於將多個小的state合併成一個大的state對象;

第三步: const store = createStore(reducers); 將state交給store管理;

第四步:action返回一個對象;這個對象交給store管理;其中reducer也是store來管理的;每次觸發一個action;就會執行全部的reducer;

能夠認爲以上種種都是爲了容器組件服務的;在containers裏面計算獲得state和返回的action純對象;這樣將action對象和state合併爲容器組件的props;繼而將props合併到UI組件中去!!

第五步:容器組件中connect方法的參數mapStateToProps方法能夠獲得全部的reducer對應的state從中獲取指定值而後合併爲組件的props;

mapDispatchToProps方法能夠返回須要用的純對象(action);方法會自動將這個對象合併到組件的props中。 

30.propTypes   子組件對父組件傳遞過來的數據類型進行強校驗

 先引入prop-types包   import  PropTypes from "prop-types"

再在子組件寫入  TodoItem.propTypes = {

                              content: PropTypes.string ,    注意大小寫

                               deleteItem: PropTypes.func,

                              index:propTypes.number.isRequired     他的斷定還有許多 好比既能夠是數字也能夠是字符串就寫成:PropTypes.oneOfType([PropTypes.number,PropTypes.string])    能夠看一下官方文檔不寫require的時候 若是父組件沒傳遞index的值的話程序也不會報錯 可是加了以後若是不傳index的值的話就會報錯   這時就能夠給index一個默認值              TodoItem.defauliProps = {

                                   index:3

                              }                      

31.Props,State,Render函數

當組件的state或props發生改變,render函數就會從新執行

當父組件的render 函數被從新執行時  子組件也會被從新執行  

32.dom即documentfragment文檔碎片

    <div class="abc"><span>hello world</span></div>

    虛擬dom就是js對象用來模擬真是dom["div",{id:"abc"},["span",{},"hello worid"]]

    js建立一個真實dom對象代價極高 要調用webapplication級別的API 很消耗性能

33.在react底層中,先生成虛擬dom,而後再根據虛擬dom生成真實dom

jsx -> createElement -> 虛擬dom (js對象) ->真實dom

因此運用jsx只是讓咱們在開發的時候方便一點 運用偏向底層的React.createElement({})也能夠達成目的

34.虛擬dom的優勢

提高性能

能夠跨域

35.setState是異步函數 爲了提高性能

36.react的虛擬dom是同層比對  若該層不同就捨棄下面的層從新渲染

37.key值最好不是k的緣由是k不穩定 因此對於比對的話很差  提升性能

38.react中的ref的使用

dom元素的引用  以前的e.target能拿到dom元素  如今

<input type="text" ref = {(input)=>{this.input = input}}/>也能夠
可是不推薦使用 由於react是數據驅動 且setState是異步函數 若寫在裏面容易出現問題
但setState提供了一個回調函數 想setState執行完在處理的部分代碼能夠寫在回調箭頭函數裏,()=>{}
39.react的聲明周期函數
聲明周期函數:指在某一時刻組件會自動調用執行的函數(如render ,constructor也能夠理解爲該函數,但不是react獨有的,因此暫不歸爲)
componentWillMount在頁面即將被掛載的時候自動執行即在render以前
componentDidMount在頁面被掛載以後自動執行  而什麼是掛載呢 是組件第一次執行的時候
shouldComponentUpdate在組件即將被更新的時候自動執行 要求返回一個boolearn值 決定組件是否更新
componentWillUpdate  在should。。。返回true時自動執行
componentDidUpdate  在render執行以後被自動執行
componentWillReceiveProps  沒有接收props時不會執行  當一個組件從父組件接受了參數,只要父組件的render函數被從新執行了,該函數就會執行
componentWillUnmount   組件即將被移除的時候被執行

初始化  -> 掛載 -> 更新 -> 移除    每一個組件都有的生命週期函數

40.生命週期函數的使用場景

(1).render函數的性能優化

  正常狀況下父組件的render函數執行就會帶着子組件的render函數一塊兒執行 但有時是不必而且損耗性能的 這時能夠經過鉤子函數來避免

其餘的react的性能優化

setState異步

虛擬dom 同層比較 key值

(2). ajax的請求

不能寫在render裏,由於render屢次執行 

因此寫在componentDidMount裏

react沒有ajax的內置功能,因此用第三方模塊

如 axios  npm add axios

import axios from 'axios'

axios.get("請求的地址")

.then(()=>{alert("xxx")})

.catch(()=>{alert('error')})

41.ajax接口數據模擬

Charles能夠抓取瀏覽器發出的請求 而且路由到你想要的地方  即中間的代理服務器

42.react的css過渡效果

transition:all 1s ease-in;

43.react的css動畫效果

@keyframes 

定義動畫效果 👆

使用動畫效果 👇

加了forward以後動畫會固定在最後一幀 否則會回到初始狀態

44.react-transition-group模塊實現動畫效果

npm install react-transition-group --save 引入

import { CSSTransition } from 'react-transition-group'

提供不少鉤子函數   具體可在GitHub上搜索看具體

 

TransitionGroup 配合 CSSTransition能實現成組動畫效果

相關文章
相關標籤/搜索