vue&react

接触了两种框架,这里大致做一下对比和总结

一、数据的流向

1.vue-双向绑定
符号表示类似于 <=>
2.react-单向流程
抽象表示类似于 环保符号

二、关键点对比

1.vue

<template>
    <div>
        //  视图路由,没有的话视图看不到,也就是显示不了
        HTML div相当于body  所以只能有一个最外层的div(标签)
        <router-view></router-view>
    </div>
</template>

<script>
  JS
export default {
    data() {
        return {
            
        }
    },
    created() {
        
    },
    methods: {
        
    },
    computed: {
        
    },
}
</script>
<style scoped>
 CSS
</style>
调用组件需要导入并声明
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',
              //  动态路由传参
                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;
  • 页面跳转
<router-link to="路由路径"/>
动态路由传参:
<router-link :to="`/cinema/edit/${scope.row.cinemaId}`">编辑</router-link>
对应路由设置为:
path: 'edit/:id'
获取传的参数:
this.$route.params.id
通过点击事件跳转,点击事件调用this.$router.push跳转
this.$router.push('/路径')
router.push传参
this.$router.push({path:'路径',query:{参数名:参数值}})
获取参数
this.$route.query.参数名

详情请看https://www.jianshu.com/p/89cb6a570eed

a组件调用b组件,a就是b的父组件,b就是a的子组件
父传子 父通过子的props属性传参数
父 <Demo name="你好">
子  <script>export default {
            props:[
                    "name"
            ]
      }</script>   访问父传过来的数据直接可以this.name访问   
子传父 子使用$emit带参调用父的自定义事件
父  <Demo  @a="b"/>
       methods:{b(data){console.log(data)}}
子 <button @click="submit">传数据</button>
    methods: {
    submit() {
      // 也可以通过点击事件来触发
      this.$emit("getUsername", this.username);
    }
  }
store => vuex文件名
state => 存放状态(数据)
mutation => 定义修改数据的方法,mutation 必须是同步函数
action => 派发,用于调用mutation里的方法,通过commit 进一步处理方法
module => 分模块管理,便于管理
getters => 设置获取数据的快捷方式
axios.get(url,{
               params:{
                    cinemaId:id
                }
            }).then( res => {
                console.log(res)
            }).catch( error => {
                console.log(error)
            })

promis封装 https://www.jianshu.com/p/d51a161958e5
基础使用 https://www.jianshu.com/p/fa50fbd963c3

  • 语法
data() {
        return {
            数据放这里
        }
}
获取数据this.变量名
修改数据值this.变量名 = 值
获取直接this,修改直接赋值
命令
渲染 v-for      v-for((item,index) in list)   :key="index"
条件渲染 v-if      v-if="true"
显示 v-show        v-show="true"
v-bind  缩写 :   动态值,函数前加
v-on   事件   缩写  @
v-model    双向绑定,用于有vlaue值的标签
插值表达式   {{ data}}   通过插值表达式把值放进html标签里
  • 组件的生命周期
<script>
    const vm = new Vue({
        el:'#app',
        data:{
            // 放数据
        },
        // vue生命周期函数   模板
        // 创建完成  里面一般放一开始就要执行的,比如获取数据的函数
        created() {
            console.log('创建完成')
        },
        // 挂载
        mounted() {
            console.log('挂载完成')
        },
        methods: {
            // 里面一般放要执行的函数或事件函数
        },
        // 更新
        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来创建
export class DefaultPage extends Component {
  static propTypes = {
    test: PropTypes.object.isRequired,
    actions: PropTypes.object.isRequired,
  };
  constructor(props){
    super(props);
    this.state={
      // 数据存放处
    }
  }
  componentDidMount(){
    // 页面构建好立马执行的方法 存放一开始需要执行的方法函数
  }
  render() {
    return (
        // class在react里需要改成className
      <div className="test-default-page">
        相当于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、子组件都是在一个大组件文件夹里进行配置的
import {
  DefaultPage,
} from './';

export default {
  path: 'test',
  name: 'Test',
  childRoutes: [
    { path: 'default-page', name: 'Default page', component: DefaultPage, isIndex: true },
  ],
};
  • 页面跳转
    react页面之间跳转使用的是Link
Link需要引入
import { Link } from 'react-router-dom';
使用方法
<Link to=“路由组件名称”>
传参用法
<Link to={`/l路由组件名称/静态参数`}>
<Link to={`{`/l路由组件名称/${动态参数}`}`}>
对应路由设置一下
path: 'detail/:接收参数的变量名'
页面获取参数
this.props.match.params.变量名

路由传参https://www.jianshu.com/p/ad8cc02b9e6c

  • 父子通讯
    react组件分为两种,容器组件和视图组件
    也就是父组件和子组件
    react使用组件需要导入、但不需要注册
父传子 :
import Swiper from './Swiper';
父   <Swiper  name="轮播图">
子获取    this.props.name
子传父
父    <Swiper  name={this.getName}>
        getName(data){
            console.log(data);
        }
子   onClick={()=>this.props.getName('你好呀')}
父获取 直接通过getName把参数给this.state里的变量储存 

更多理解https://www.jianshu.com/p/066c594e0efc

  • redux
    redux储存状态、用于储存用户状态,根据状态判断
redux 状态储存,用于储存用户状态,根据状态判断
state=>存放储存状态的变量
action =>派发任务(修改方法)
reducer=>储存修改变量的方法
react里redux是对应每个组件都有一个redux文件,最后回归到一个总的redux文件里,action也是一样。
简单理解就是一对多,一个总的redux对应多个子的redux,子的进行更改总的也会更改。

详情 https://www.jianshu.com/p/951402e7a1a4

export class DefaultPage extends Component {
  constructor(props){
    super();
    this.state={
      // 这里的state相当于date
      flowlist:[]
    }
  }
  static propTypes = {
    index: PropTypes.object.isRequired,
    actions: PropTypes.object.isRequired,
  };
  // 挂载函数,页面创建后立马运行的函数
  componentDidMount(){
    this.getlist();
  }
  // 获取后台数据,并给flowlist
  async getlist(){
    let url = '/flower/getList';
    let res = await $http.get(url);
    this.setState({
      flowlist:res.flowers
    })
  }
}
  • 语法
props 组件的所有数据
// 构造器(用于初始化类的实例) constructor
    constructor()
// 执行父类构造器 super
        super();
this.state存放数据
获取数据this.state.变量名
修改数据 this.setState(变量名:值)
bind方法     用于绑定事件的this指向constructor
定义react组件
// 定义一个react的组件 继承了React.Component自带的类的属性
        class Person extends React.Component
         // props是父组件传过来的属性
ReactDOM.render()    输出到页面,内要有jsx格式和获取节点,来输出到页面
react.min.js - React 的核心库
        react-dom.min.js - 提供与 DOM 相关的功能
        babel.min.js - Babel 可以将 ES6 代码转为 ES5 代码,
        这样我们就能在目前不支持 ES6 浏览器上执行 React 代码。
        Babel 内嵌了对 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>

更多理解可查看 https://www.jianshu.com/p/c28c07293ff5
渲染https://www.jianshu.com/p/260627daea68
https://www.jianshu.com/p/cf63d3e9459e
事件https://www.jianshu.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('更新完毕');
            }
            // 默认每一次的修改都触发页面更新,此函数用于干预是否要更新,孕育性能优化
            shouldComponentUpdate(nextProps,nextState){
            }
            componentWillUnmount(){
                console.log('将要卸载')
            }
            render() {
                return(
                    <div>生命周期</div>
                )   
            }
        }
        ReactDOM.render(
            <Demo />,
            document.querySelector('#app')
        )
    </script>
  • react带value值的标签的绑定数据
通过绑定change事件来监听vlaue的变化并且更改this.state里对应的值
constructor(props) {
    super(props);
    this.state = {
      codenum: '123456'
    }
    this.setcodenum = this.setcodenum.bind(this);//绑定this指向
  }
render() {
    let {  codenum } = this.state;// 解构
<input  type="text" placeholder="请输入验证码" value={codenum} onChange={this.setcodenum} />}
通过ev属性获取到当前的标签属性和值再更改this.state里的值
setcodenum(ev) {
    let target = ev.target;
    let value = target.value;
    this.setState({
      codenum: value
    })
  }

三、相同点和不同点

1.相同点

  • 组件化思想
  • 都有储存状态的方法 vuex和redux
  • 都可以动态路由传参
  • 都可以用location缓存数据

2.不同点

  • 数据流向
  • 语法
    vue三个在一个里面些,分三层
    react则是JSX语法
    修改数据的方法不同
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容