React

react 2013 單向數(shù)據(jù)流
和vue區(qū)別
內(nèi)存的改變影響頁面的改變,不管頁面的改變, 影響內(nèi)存的改變
自己處理頁面的改變, 影響內(nèi)存, 通過事件, 調(diào)用函數(shù), 通知根據(jù)內(nèi)存對象改變頁面
沒有指令

安裝React腳手架: npm install -g create-react-app
創(chuàng)建腳手架: create-react-app myApp
產(chǎn)看版本: create-react-app --version

安裝react-router: cnpm i react-router -S
安裝react-router-dom: cnpm i react-router-dom -S
安裝redux: cnpm i redux

展示配置文件: npm run eject
使用sass: npm i node-sass

有變化的屬性
className
htmlFor
style={{ fontSize: '12px' }}

this.state: 讀取狀態(tài)
this.setState: 更新組件的狀態(tài)

import React, { Component } from 'react' //創(chuàng)建組件麸拄、虛擬DOM元素, 生命周期
import ReactDOM from 'react-dom' //把創(chuàng)建好的 組件 和 虛擬DOM放到頁面上面展示

創(chuàng)建虛擬DOM元素
// 參數(shù)1: 創(chuàng)建的元素的類型, 字符串, 表示元素的名稱
// 參數(shù)2: 是一個(gè)對象或 null, 表示 當(dāng)前這個(gè) DOM 元素的屬性
// 參數(shù)3: 子節(jié)點(diǎn) (包括 其他 虛擬DOM 獲取 文本子節(jié)點(diǎn))
// 參數(shù)n: 其它子節(jié)點(diǎn)
const myh1 = React.createElement('h1',{title:"this is a h1", id: "myh1"},'這是一個(gè)標(biāo)題H1')

使用 ReactDOM 把虛擬 DOM 渲染到頁面上
// 參數(shù)1: 要渲染的那個(gè)虛擬DOM元素
// 參數(shù)2: 指定頁面上一個(gè)容器
ReactDOM.render(myh1, document.getElementById("app"))

class關(guān)鍵字創(chuàng)建組件
class Movie extends React.Component{
//render 函數(shù)的作用, 是 渲染 當(dāng)前組件所對應(yīng)的 虛擬DOM元素
render() {
return (
<div>這是Movie組件</div>
)
}
}
##const Footer = ()=>{
return (
)
}

Ref選取dom元素
<input type="text" ref="id"/> ref ==> this.refs.id.value
<input type="text" ref="id=>this.id = id" /> this.id.value

限定接收props類型
TodoList.propTypes = {
title: PropTypes.number.isRequired //必須傳遞此屬性
}
array ==> bool ==> func ==> number ==> object ==> string ==> symbol
指定屬性默認(rèn)值
Person.defaultProps = {
sex: '男',
age: 18
}
父傳子:
組件接收屬性值的傳遞:
this.props屬性名
例如:
<Header title="留言"> <div>這是我的children</div> </Header>
constructor(props){
super(props)
render(){
return(
{this.props.title}
{this.props.children}
)
}
}

子傳父:
在父組件中定義一個(gè)設(shè)置state的方法, 然后把這個(gè)方法通過屬性傳遞給子組件
在子組件中調(diào)用這個(gè)方法惰聂。 把值傳入就可以了。

路由react-router-dom: exact精確匹配
安裝: cnpm i react-router-dom -S
引入: import { BrowserRouter,HashRouter, Route, Link, NavLink, Switch, Redirect, useParams } from 'react-router-dom';
代碼:
<Router>
<div>
<switch> //匹配到第一個(gè)終止匹配
<Route exact path="/home" component={Home} />
<Route exact path="/kind" component={Kind} />
<Route exact path="/user" component={User} />
<Redirect from="/" to="/home" /> //跟目錄跳轉(zhuǎn)home頁面
<Route exact path="/404" component={404}> //配置404頁面
<Redirect from="/*" to="/" /> //重定向404頁面
</switch>
</div>
</Router>
react路由懶加載
yarn add react-loadable
import Loadable from 'react-loadable';
編程跳轉(zhuǎn)
指定前進(jìn)后退: this.props.history.go()
后退: this.props.history.goBack()
前進(jìn): this.props.history.goForward()

    this.props.history.push('/Home');
    query傳參
        this.props.history.push({ pathName:'/Home', search:'id=id&name=name' })
    
params動態(tài)路由傳參:
    跳轉(zhuǎn)傳參:  <NavLink to="/detail/paramName" activeClassName="navActive"></NavLink>
    路由配置:  <Route path="/detail/:paramName" component={Detail} />
    組件參數(shù)接收:  this.props.match.params.paramName
    
query動態(tài)路由傳參:
    跳轉(zhuǎn)傳參:  <NavLink to={{pathName:"/detail",search:"?id=123&name=tian"}} activeClassName="navActive"></NavLink>
    路由配置:  <Route path="/detail" component={Detail} />
    組件參數(shù)接收:  this.props.location.search
    ① 此時(shí)拿到是一個(gè)字符串 'id=1&name=2'
        需要安裝 
            npm i query-string
        使用
            import queryString from 'query-string';
    queryString.parse( this.props.location.search )

redux
安裝 npm i redux
配置
index.js文件下
import { createStore } from 'redux';
import reducer from './reducer.js'
const store = createStore(reducer);
export default store;
reducer.js文件下
const defaultState = {
list: [1,2,3,4,5]
}
export default (state=defaultState, action) => {
return state
}
獲取state:
import store from './store.js'
store.getState().list;
訂閱state改變: //每次派發(fā)action的時(shí)候重新獲取數(shù)據(jù)
store.subscribe(this.handleSubScribe)
觸發(fā)對應(yīng)事件改變state
handleSubScribe = ()=>{
this.setState({
initState = store.getState().initState;
})
}
更新state:
const action = {
type: "CHANGE_VALUE",
value: '新的value'
};
store.dispatch(action)
在reducer.js文件下
export default (state=defaultState, action) => {
if(action.type == 'CHANGE_VALUE'){
const initState = {...state};
initState.value = action.value;
return initState;
}
return state
}
模塊化:
reducer.js文件下
import {combineReducers} from 'redux';
import homeReducer from './modules/homeReducer'
import userReducer from './modules/userReducer'
let reducer = combineReducers({
home: homeReducer,
user: userReducer
})
export default reducer
homeReducer.js文件下 || userReducer.js文件下
const defaultState = {
list: [1,2,3,4,5]
}
export default (state=defaultState, action) => {
return state
}
獲取:
store.getState().home.value
訂閱:
store.subscribe(this.handleSubScribe);
handleSubScribe = () => {
this.setState({
value: store.getState().home.value
})
}
更新state:
const action = {
type: "CHANGE_VALUE",
value: '新的value'
};
store.dispatch(action)
在homeReducer.js文件下
export default (state=defaultState, action) => {
if(action.type == 'CHANGE_VALUE'){
const initState = {...state};
initState.value = action.value;
return initState;
}
return state
}
react-redux
安裝:
cnpm i react-redux
APP.js文件內(nèi)
import store from './store/index.js'
所有組件使用 ** 包裹
<Provider store={store}></Provider>

    頁面內(nèi)使用:
        const mapStateToProps = state => {
          return {
            name: state.home.name
          }
        }
        const mapDispatchToProps = dispatch => {
          return {
            changeName(){
              dispatch({
                type:'CHANGE_NAME',
                value:'田國元'
              })
            }
          }
        }
        export default connect(reduxState, reduxAction)(Home);
redux-thunk
    安裝:
        cnpm i redux-thunk
    store文件下index.js
        import { createStore,compose,applyMiddleware } from 'redux';
        import reducer from './reducer.js'
        import thunk from 'redux-thunk'
        const store = createStore(reducer,compose(applyMiddleware(thunk)));
        export default store;
    頁面內(nèi): ## redux-thunk異步請求解決了redux的action只能是對象, 可以讓對象形式改成為異步函數(shù),異步函數(shù)接收dispatch
        const reduxAction = dispatch => {
          return {
            changeName(){
            dispatch(dispatchs => {
                fetch('./data.json').then(res=>res.json()).then(data=>{
                  console.log(data);
                  dispatchs({
                    type:'CHANGE_NAME',
                    value: data.id
                  })
                })
              })
            }
          }
        }

React生命周期
getDefaultProps 初始化prop屬性 (es6的寫法中被刪除)
getInitialState 初始化當(dāng)前狀態(tài) (es6的寫法中被刪除)
**componentWillMount 組件初始化前 (即將進(jìn)入dom)
**componentDidMount 組件初始化DOM插入完后 (已經(jīng)進(jìn)入dom)
**render 觸發(fā)state改變UI

componentWillReceiveProps 父組件傳遞調(diào)用方法
shouldComponentUpdata 是否要更新 return false 就不會更新

componentWillUpdate 組件更新之前
componentDidUpdate 組件更新之后
componentWillUnmount 組件銷毀前
componentDidUnmount 組件銷毀后

注意點(diǎn):
1. XML 基本語法
定義標(biāo)簽是, 只允許被一個(gè)標(biāo)簽包裹
標(biāo)簽一定要閉合
2. 元素類型
小寫首字母對應(yīng) DOM 元素屬性
大寫首字母對應(yīng)組件元素
注釋使用 js 注釋方法
3. 元素屬性
class 屬性改為 className
for 屬性改為 htmlFor
Boolean 屬性: 省略 Boolean 屬性值會導(dǎo)致 JSX 認(rèn)為 bool 值設(shè)為了 true
4. JavaScript 屬性表達(dá)式
屬性只要使用表達(dá)式, 只要用 {} 替換 "" 即可
<input type="text" value={ val ? val : "" } />
5. HTML 轉(zhuǎn)義
React會將所有要顯示到 DOM 的字符串轉(zhuǎn)義, 放置 XSS.
后臺傳過來的數(shù)據(jù)帶頁面標(biāo)簽的是不能直接轉(zhuǎn)義的, 集體轉(zhuǎn)移的寫法如下:
var content= ' <strong> content </strong> ';
React.render(
<div dangerouslySetInnerHTML = {{__html: content}}> </div>,
document.body
)

動畫: ReactCSSTransitionGroup
1. 引入組件
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
2.使用ReactCSSTransitionGroup 標(biāo)簽包裹動畫標(biāo)簽
<ReactCSSTransitionGroup
transitionName='example'
transitionEnterTimeout={500}
transitionLeaveTimeout={300}
>
</ReactCSSTransitionGroup>
注意:
生成{items}的時(shí)候, 里面沒一個(gè)元素必須包含KEY屬性再菊。 因?yàn)閞eact 要判斷哪個(gè)元素進(jìn)入, 停留, 移除

    css: {
        .example-enter  // 進(jìn)入動畫的起點(diǎn)
        .example-enter-active  // 進(jìn)入動畫的終點(diǎn)
        .example-leave  // 離開動畫的起點(diǎn)
        .example-leave-active  // 離開動畫的終點(diǎn)
        
        .example-enter{ margin-left: -200px; transform:rotate(0deg); transition-duration:500ms; }
        .example-enter-active{ margin-left: 0px; transform:rotate(3600deg); }
        .example-leave{ margin-left:0px; opacity:1; transition-duration:300ms; }
        .example-leave-active{ margin-left:600px; opacity:0; }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宋彼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子批狱,更是在濱河造成了極大的恐慌阳懂,老刑警劉巖梅尤,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岩调,居然都是意外死亡巷燥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門号枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缰揪,“玉大人,你說我怎么就攤上這事葱淳《巯伲” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵赞厕,是天一觀的道長艳狐。 經(jīng)常有香客問我,道長皿桑,這世上最難降的妖魔是什么毫目? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮诲侮,結(jié)果婚禮上镀虐,老公的妹妹穿的比我還像新娘。我一直安慰自己沟绪,他們只是感情好刮便,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著近零,像睡著了一般诺核。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上久信,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音漓摩,去河邊找鬼裙士。 笑死,一個(gè)胖子當(dāng)著我的面吹牛管毙,可吹牛的內(nèi)容都是我干的腿椎。 我是一名探鬼主播桌硫,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啃炸!你這毒婦竟也來了铆隘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤南用,失蹤者是張志新(化名)和其女友劉穎膀钠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹虫,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肿嘲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筑公。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雳窟。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匣屡,靈堂內(nèi)的尸體忽然破棺而出封救,到底是詐尸還是另有隱情,我是刑警寧澤捣作,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布兴泥,位于F島的核電站,受9級特大地震影響虾宇,放射性物質(zhì)發(fā)生泄漏搓彻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一嘱朽、第九天 我趴在偏房一處隱蔽的房頂上張望旭贬。 院中可真熱鬧,春花似錦搪泳、人聲如沸稀轨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奋刽。三九已至,卻和暖如春艰赞,著一層夾襖步出監(jiān)牢的瞬間佣谐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工方妖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狭魂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像雌澄,于是被迫代替她去往敵國和親斋泄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容