Vue React 各种大乱炖 对比

本文详细对比了Vue和React两大前端框架,从单文件引入、构建项目、虚拟DOM、数据驱动、列表渲染、条件渲染、动态绑定、指令、计算属性、事件处理等方面深入解析两者的异同,为开发者选择合适框架提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

框架对比

/VueReact
单文件直接引入vue.jsreact.js + react-dom.js + babel.js
构建项目vue-clicreate-react-app
虚拟DOM
虚拟DOM区域(挂载区域)el 参数值ReactDOM.render() 第二个参数值
数据驱动
Model数据源初始化,定义在data:{} 或 data () { return {} }里在state里 constructor () { this.state = {} }
数据渲染{{ }} 插值渲染 支持表达式JSX { } 表达式
列表渲染v-for在JSX 内构建一个元素集合 {this.state.arr.map((item,index)=><li key={index}>{item}</li>)}
条件渲染v-if{this.state.show? <h1>条件渲染</h1> : null}
子组件内元素渲染slotthis.props.children
动态绑定v-bindtitle={this.state.title}
数据更新重新赋值 this.id = xxx; / this.$set()this.setState({id:xx}) 更新数据
指令
计算属性
添加classclass / :class使用className className=“red”
动态切换class:class="[show? ‘class1’: ‘class2’]"className={this.state.show ? “class1” : “class2”}
style行间style / :stylejsx写法 style={{color:“pink”}}
css作用域(私有)style scopedCSS Modules
ref
事件写法@click=“clickFn”onClick={this.clickFn.bind(this)}
事件处理函数methods: {}里与render(){} 方法同级
生命周期钩子函数created() mounted() 等componentDidMount() componentDidUpdate() 等
创建组件Vue.component全局 / components:{} 局部function组件 / class组件 正好对应 Redux中的UI组件和容器组件,一个负责内容展示,一个负责操作数据
组件定义规则1.kebab-case (短横线分隔命名) 2.PascalCase (大驼峰式)为了区分原生标签,组件必须大写
组件特点.vue文件 分html、js、css三块all in js
组件自身作用域有 data里的数据属于组件本身有 state数据属于自身类
过渡动画transition组件使用react-transition-group
数据流向单向数据流单向数据流
数据双向绑定v-model受控组件(onChange & value )
属性监听watchstatic getDerivedStateFromProps(props, state) 拿到即将更新后的props和state。只能自己去手动对比
监听DOM变化nextTick()无,只能从componentDidUpdate()取DOM,类似Vue 的updated()生命周期
父组件向子组件传值同为单向数据流,props往下传值 - 需要在子组件接收props:[‘xx’],然后就可以使用xx值同为单向数据流,props往下传值 - 直接使用this.props.xx 取到值
props数据类型限定在props对象中限定具体类型PropTypes 需单独引包
组件跨级传值context
子组件向父组件传值均使用回调函数通知父组件。子组件this.$emit触发父组件事件,父级在监听事件中获取子组件传递的值均使用回调函数通知父组件。子组件this.props.xx 触发父组件事件,父级在监听事件中获取子组件传递的值

路由对比

/vue-routerreact-router
路由vue-routerreact-router

状态管理对比

/VuexReact-Redux
状态statestate
状态仓库StoreStore
状态的计算属性有 state的计算属性,getters(其实就是基于Vue的计算属性)
Store单一数据源
定义Storenew Vuex.Store()createStore(reducers) 需要reducers纯函数
组件如何拿到statenew Vue() 把store注入到store选项上,成为this实例的属性,让各个组件都可以拿到给根组件套上标签,在顶层传入store, 子孙组件通过context拿到state,但是UI组件必须使用connect()方法进行装饰,在使用mapStateToProps映射后,取值
各自框架中获取state$store.state.xx(template) this.$store.state.xx(js)this.props.xx
修改状态方法The only way to actually change state in a Vuex store is by committing a mutation. 提交 mutationThe only way to change the state tree is to emit an action, an object describing what happened. 触发action,一个描述发生什么的对象
修改状态(同步)view——>commit——>mutations——>state变化——>view变化(同步)view——>actions——>reducer——>state变化——>view变化(同步)
修改状态(异步)view——>dispatch——>actions——>mutations——>state变化——>view变化(异步)view——>actions——>redux middleware——>actions——>reducer——>state变化——>view变化 (异步)
同步/异步处理方式提出mutations同步,actions异步,两者相不干扰同步dispatch进入reducer改状态,异步需要配置中间件,在进入dispatch()后,在中间件层做处理。 Dva借鉴了Vuex
原store更改状态写法store.commit() / store.dispatch()store.dispatch()
各自框架中的修改状态因store挂载到实例下,所以可以直接使用实例的对象方法。 this.$store.commit()/ this.$store.dispatch()mapDispatchToProps映射Action后,调用一个action creator函数 this.props.Fn(),去执行dispatch操作
更新状态mutations 直接更新状态。 非纯函数reducer返回新状态,并不是去更新值。 纯函数
状态变化如何更新View层Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。组件订阅mapStateToProps,当映射state的部分值改变时会执行this.setState(),重新渲染View
模块化有 多个module,类似一个小store,每个小module有自己的state,actions等无 Dva有namespace

基于各自框架

/VueReact
UI库element-ui iview 等Ant-design 等
多端统一开发框架uni-appTaro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值