vue&react

接觸了兩種框架令野,這里大致做一下對比和總結(jié)

一桥爽、數(shù)據(jù)的流向

1.vue-雙向綁定
符號表示類似于 <=>
2.react-單向流程
抽象表示類似于 環(huán)保符號

二杠览、關(guān)鍵點對比

1.vue

<template>
    <div>
        //  視圖路由报账,沒有的話視圖看不到蝴罪,也就是顯示不了
        HTML div相當(dāng)于body  所以只能有一個最外層的div(標(biāo)簽)
        <router-view></router-view>
    </div>
</template>

<script>
  JS
export default {
    data() {
        return {
            
        }
    },
    created() {
        
    },
    methods: {
        
    },
    computed: {
        
    },
}
</script>
<style scoped>
 CSS
</style>
調(diào)用組件需要導(dǎo)入并聲明
import Demo from './Demo'
components: {
    組建名
    Demo
  }

然后才可以在html里使用
<template>
    <div>
        <Demo/>
        <router-view></router-view>
    </div>
</template>

import Vue from 'vue';
import Router from 'vue-router';

// 使用Router
Vue.use(Router);

// 配置路由
const routerList =[
    {
        path: '/order',
        meta: {
            title: '訂單',
        },
        component: () => import('@/views/order/index'),
        redirect: '/order/list',
        // 子路由
        children: [
            {
                path: 'list/:id',
              //  動態(tài)路由傳參
                meta: {
                    title: "電影訂單",
                },
                component: () => import('@/views/order/children/list'),
            },
            {
                path: 'xiangqing',
                meta: {
                    title: "訂單詳情",
                },
                component: () => import('@/views/order/children/xiangqing'),
            }
        ]
    },
]

const router = new Router({
    routes:routerList
})
export default router;
  • 頁面跳轉(zhuǎn)
<router-link to="路由路徑"/>
動態(tài)路由傳參:
<router-link :to="`/cinema/edit/${scope.row.cinemaId}`">編輯</router-link>
對應(yīng)路由設(shè)置為:
path: 'edit/:id'
獲取傳的參數(shù):
this.$route.params.id
通過點擊事件跳轉(zhuǎn),點擊事件調(diào)用this.$router.push跳轉(zhuǎn)
this.$router.push('/路徑')
router.push傳參
this.$router.push({path:'路徑',query:{參數(shù)名:參數(shù)值}})
獲取參數(shù)
this.$route.query.參數(shù)名

詳情請看http://www.reibang.com/p/89cb6a570eed

a組件調(diào)用b組件,a就是b的父組件,b就是a的子組件
父傳子 父通過子的props屬性傳參數(shù)
父 <Demo name="你好">
子  <script>export default {
            props:[
                    "name"
            ]
      }</script>   訪問父傳過來的數(shù)據(jù)直接可以this.name訪問   
子傳父 子使用$emit帶參調(diào)用父的自定義事件
父  <Demo  @a="b"/>
       methods:{b(data){console.log(data)}}
子 <button @click="submit">傳數(shù)據(jù)</button>
    methods: {
    submit() {
      // 也可以通過點擊事件來觸發(fā)
      this.$emit("getUsername", this.username);
    }
  }
store => vuex文件名
state => 存放狀態(tài)(數(shù)據(jù))
mutation => 定義修改數(shù)據(jù)的方法董济,mutation 必須是同步函數(shù)
action => 派發(fā),用于調(diào)用mutation里的方法要门,通過commit 進(jìn)一步處理方法
module => 分模塊管理虏肾,便于管理
getters => 設(shè)置獲取數(shù)據(jù)的快捷方式
axios.get(url,{
               params:{
                    cinemaId:id
                }
            }).then( res => {
                console.log(res)
            }).catch( error => {
                console.log(error)
            })

promis封裝 http://www.reibang.com/p/d51a161958e5
基礎(chǔ)使用 http://www.reibang.com/p/fa50fbd963c3

  • 語法
data() {
        return {
            數(shù)據(jù)放這里
        }
}
獲取數(shù)據(jù)this.變量名
修改數(shù)據(jù)值this.變量名 = 值
獲取直接this欢搜,修改直接賦值
命令
渲染 v-for      v-for((item,index) in list)   :key="index"
條件渲染 v-if      v-if="true"
顯示 v-show        v-show="true"
v-bind  縮寫 :   動態(tài)值封豪,函數(shù)前加
v-on   事件   縮寫  @
v-model    雙向綁定,用于有vlaue值的標(biāo)簽
插值表達(dá)式   {{ data}}   通過插值表達(dá)式把值放進(jìn)html標(biāo)簽里
  • 組件的生命周期
<script>
    const vm = new Vue({
        el:'#app',
        data:{
            // 放數(shù)據(jù)
        },
        // vue生命周期函數(shù)   模板
        // 創(chuàng)建完成  里面一般放一開始就要執(zhí)行的炒瘟,比如獲取數(shù)據(jù)的函數(shù)
        created() {
            console.log('創(chuàng)建完成')
        },
        // 掛載
        mounted() {
            console.log('掛載完成')
        },
        methods: {
            // 里面一般放要執(zhí)行的函數(shù)或事件函數(shù)
        },
        // 更新
        updated() {
            
        },
        // 銷毀
        destroy(){

        }
    })
</script>
</html>

2.react

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import * as actions from './redux/actions';
// 組件采用繼承react里的Component來創(chuàng)建
export class DefaultPage extends Component {
  static propTypes = {
    test: PropTypes.object.isRequired,
    actions: PropTypes.object.isRequired,
  };
  constructor(props){
    super(props);
    this.state={
      // 數(shù)據(jù)存放處
    }
  }
  componentDidMount(){
    // 頁面構(gòu)建好立馬執(zhí)行的方法 存放一開始需要執(zhí)行的方法函數(shù)
  }
  render() {
    return (
        // class在react里需要改成className
      <div className="test-default-page">
        相當(dāng)于html吹埠,但是可以跟js寫在一起,{}代表js代碼,JSX語法
      </div>
    );
  }
}

/* 把所有的state添加到props */
function mapStateToProps(state) {
  return {
    test: state.test,
  };
}

/* 把所有的action添加到props */
function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators({ ...actions }, dispatch)
  };
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(DefaultPage);
  • 路由配置
    在rekit腳手架里,router缘琅、redux粘都、子組件都是在一個大組件文件夾里進(jìn)行配置的
import {
  DefaultPage,
} from './';

export default {
  path: 'test',
  name: 'Test',
  childRoutes: [
    { path: 'default-page', name: 'Default page', component: DefaultPage, isIndex: true },
  ],
};
  • 頁面跳轉(zhuǎn)
    react頁面之間跳轉(zhuǎn)使用的是Link
Link需要引入
import { Link } from 'react-router-dom';
使用方法
<Link to=“路由組件名稱”>
傳參用法
<Link to={`/l路由組件名稱/靜態(tài)參數(shù)`}>
<Link to={`{`/l路由組件名稱/${動態(tài)參數(shù)}`}`}>
對應(yīng)路由設(shè)置一下
path: 'detail/:接收參數(shù)的變量名'
頁面獲取參數(shù)
this.props.match.params.變量名

路由傳參http://www.reibang.com/p/ad8cc02b9e6c

  • 父子通訊
    react組件分為兩種,容器組件和視圖組件
    也就是父組件和子組件
    react使用組件需要導(dǎo)入、但不需要注冊
父傳子 :
import Swiper from './Swiper';
父   <Swiper  name="輪播圖">
子獲取    this.props.name
子傳父
父    <Swiper  name={this.getName}>
        getName(data){
            console.log(data);
        }
子   onClick={()=>this.props.getName('你好呀')}
父獲取 直接通過getName把參數(shù)給this.state里的變量儲存 

更多理解http://www.reibang.com/p/066c594e0efc

  • redux
    redux儲存狀態(tài)刷袍、用于儲存用戶狀態(tài)翩隧,根據(jù)狀態(tài)判斷
redux 狀態(tài)儲存,用于儲存用戶狀態(tài)呻纹,根據(jù)狀態(tài)判斷
state=>存放儲存狀態(tài)的變量
action =>派發(fā)任務(wù)(修改方法)
reducer=>儲存修改變量的方法
react里redux是對應(yīng)每個組件都有一個redux文件堆生,最后回歸到一個總的redux文件里,action也是一樣雷酪。
簡單理解就是一對多淑仆,一個總的redux對應(yīng)多個子的redux,子的進(jìn)行更改總的也會更改哥力。

詳情 http://www.reibang.com/p/951402e7a1a4

export class DefaultPage extends Component {
  constructor(props){
    super();
    this.state={
      // 這里的state相當(dāng)于date
      flowlist:[]
    }
  }
  static propTypes = {
    index: PropTypes.object.isRequired,
    actions: PropTypes.object.isRequired,
  };
  // 掛載函數(shù),頁面創(chuàng)建后立馬運(yùn)行的函數(shù)
  componentDidMount(){
    this.getlist();
  }
  // 獲取后臺數(shù)據(jù),并給flowlist
  async getlist(){
    let url = '/flower/getList';
    let res = await $http.get(url);
    this.setState({
      flowlist:res.flowers
    })
  }
}
  • 語法
props 組件的所有數(shù)據(jù)
// 構(gòu)造器(用于初始化類的實例) constructor
    constructor()
// 執(zhí)行父類構(gòu)造器 super
        super();
this.state存放數(shù)據(jù)
獲取數(shù)據(jù)this.state.變量名
修改數(shù)據(jù) this.setState(變量名:值)
bind方法     用于綁定事件的this指向constructor
定義react組件
// 定義一個react的組件 繼承了React.Component自帶的類的屬性
        class Person extends React.Component
         // props是父組件傳過來的屬性
ReactDOM.render()    輸出到頁面省骂,內(nèi)要有jsx格式和獲取節(jié)點蟀淮,來輸出到頁面
react.min.js - React 的核心庫
        react-dom.min.js - 提供與 DOM 相關(guān)的功能
        babel.min.js - Babel 可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼,
        這樣我們就能在目前不支持 ES6 瀏覽器上執(zhí)行 React 代碼钞澳。
        Babel 內(nèi)嵌了對 JSX 的支持怠惶。
        通過將 Babel 和 babel-sublime 包(package)一同使用可以讓源碼的語法渲染上升到一個全新的水平。

JSX語法

<script type="text/babel">
        const person={
            name:'fanyong',
            age:108
        };
        // html和js混寫
        const element = 
        // jsx語法遇到<>代表html來編譯 遇到{}代表js來編譯
        <h1>
            <p>姓名: {person.name}</p>
            <p>年齡: {person.age}</p>
        </h1>;

        ReactDOM.render(
            element,
            document.querySelector('#app')
        )
    </script>

更多理解可查看 http://www.reibang.com/p/c28c07293ff5
渲染http://www.reibang.com/p/260627daea68
http://www.reibang.com/p/cf63d3e9459e
事件http://www.reibang.com/p/db3df16113fa

  • 組件的生命周期
<script type="text/babel">
    /**
     * react的生命周期分為三種
     * 1.mount 掛載
     * 2.update 更新
     * 3.unmount 卸載
    */
        class Demo extends React.Component{
            constructor(props){
                super(props);
            }
            componentWillMount(){
                console.log('即將掛載')
            }
            componentDidMount(){
                console.log('已掛載')
            }
            componentWillUpdate(nextProps,nextState){
                console.log('將要更新')
            }
            componentDidUpdate(prevProps,prevState){
                console.log('更新完畢');
            }
            // 默認(rèn)每一次的修改都觸發(fā)頁面更新轧粟,此函數(shù)用于干預(yù)是否要更新策治,孕育性能優(yōu)化
            shouldComponentUpdate(nextProps,nextState){
            }
            componentWillUnmount(){
                console.log('將要卸載')
            }
            render() {
                return(
                    <div>生命周期</div>
                )   
            }
        }
        ReactDOM.render(
            <Demo />,
            document.querySelector('#app')
        )
    </script>
  • react帶value值的標(biāo)簽的綁定數(shù)據(jù)
通過綁定change事件來監(jiān)聽vlaue的變化并且更改this.state里對應(yīng)的值
constructor(props) {
    super(props);
    this.state = {
      codenum: '123456'
    }
    this.setcodenum = this.setcodenum.bind(this);//綁定this指向
  }
render() {
    let {  codenum } = this.state;// 解構(gòu)
<input  type="text" placeholder="請輸入驗證碼" value={codenum} onChange={this.setcodenum} />}
通過ev屬性獲取到當(dāng)前的標(biāo)簽屬性和值再更改this.state里的值
setcodenum(ev) {
    let target = ev.target;
    let value = target.value;
    this.setState({
      codenum: value
    })
  }

三、相同點和不同點

1.相同點

  • 組件化思想
  • 都有儲存狀態(tài)的方法 vuex和redux
  • 都可以動態(tài)路由傳參
  • 都可以用location緩存數(shù)據(jù)

2.不同點

  • 數(shù)據(jù)流向
  • 語法
    vue三個在一個里面些兰吟,分三層
    react則是JSX語法
    修改數(shù)據(jù)的方法不同
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末通惫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子混蔼,更是在濱河造成了極大的恐慌履腋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惭嚣,死亡現(xiàn)場離奇詭異遵湖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晚吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門延旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人槽地,你說我怎么就攤上這事迁沫÷” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵集畅,是天一觀的道長近弟。 經(jīng)常有香客問我,道長牡整,這世上最難降的妖魔是什么藐吮? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任溺拱,我火速辦了婚禮逃贝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迫摔。我一直安慰自己沐扳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布句占。 她就那樣靜靜地躺著沪摄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纱烘。 梳的紋絲不亂的頭發(fā)上杨拐,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音擂啥,去河邊找鬼哄陶。 笑死,一個胖子當(dāng)著我的面吹牛哺壶,可吹牛的內(nèi)容都是我干的屋吨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼山宾,長吁一口氣:“原來是場噩夢啊……” “哼至扰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起资锰,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤敢课,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绷杜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翎猛,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年接剩,在試婚紗的時候發(fā)現(xiàn)自己被綠了切厘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡懊缺,死狀恐怖疫稿,靈堂內(nèi)的尸體忽然破棺而出培他,到底是詐尸還是另有隱情,我是刑警寧澤遗座,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布舀凛,位于F島的核電站,受9級特大地震影響途蒋,放射性物質(zhì)發(fā)生泄漏猛遍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一号坡、第九天 我趴在偏房一處隱蔽的房頂上張望懊烤。 院中可真熱鬧,春花似錦宽堆、人聲如沸腌紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壁肋。三九已至,卻和暖如春籽慢,著一層夾襖步出監(jiān)牢的瞬間浸遗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工箱亿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留跛锌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓极景,卻偏偏與公主長得像察净,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盼樟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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