VueJs的用法:
状态管理
- Vuex实现状态管理,针对数据的持久化存储的需求可以使用vuex-persistedstate插件包裹仓库,原理为本地存储,实现vuex统一管理数据
路由守卫
- 路由守卫(全局,局部),可实现权限的处理与路由的重定向
路由对象
- this.$route:路由对象,可获取路由的具体信息及参数
- this.$router:路由对象,可使用push,replace等路由方法
ReactJs的用法:
状态管理
- redux:使用比较多的一种,页面引入connect,高阶组件的方式使用connect传入页面组件,
页面触发dispatch传入action类型,action再找到对应的reducer,写法比较繁琐 - dvajs的model仓库:
redux基础上简化了与仓库的交互流程,目录清晰,
新增effects副作用写法,实则异步操作,集成redux-saga,采用generator式写法
新增subscriptions订阅,可实现对路由的监听与处理
页面可引入dva里的connect,使用es7新语法@connect抛出model方法对象,页面使用this.props.方法名进行调用 - mobx与flux等
路由生成
- react的路由需要以标签的形式生成,从react-router-dom下引入route,switch,redirect等组件标签
- 可模拟vuejs书写一个routes数组抛出,使用递归生成router-view嵌入到根实现路由,这种写法更简单
样式
- 为避免样式冲突,可使用Css-Model,import styles './indexpage.less',结构上使用classname={styles.indexWrap}的写法
路由
- 历史模式下路由对象为this.props.history,包括跳转路由的方法
VueJs对比ReactJs
设计理念
-
react整体函数式思想,推崇结合immutable实现数据不可变,setstate来改变数据,shouldComponentUpdate来控制是否重新渲染,也常在此生命周期做优化
-
react的性能优化需要手动去做,而vue的性能优化是自动的,但是vue的响应式机制也有问题,就是当state特别多的时候,Watcher也会很多,会导致卡顿,所以大型应用(状态特别多的)一般用react,更加可控。
书写方式
-
react的思路是all in js,通过js来生成html,所以设计了jsx,还有通过js来操作css,社区的styled-component、jss等,flutter的书写风格和react比较像
-
vue是把html,css,js组合到一起,用各自的处理方式,vue有单文件组件,可以把html、css、js写到一个文件中,html提供了模板引擎来处理。
页面的生成
- react一般使用class类继承式的写法
而vue是声明式的写法,通过传入各种options,api和参数都很多。所以react结合typescript更容易一起写,vue稍微复杂。
vue结合vue-class-component也可以实现类式的写法,但是还是需要通过decorator来添加声明,并不纯粹
扩展
- react可以通过高阶组件(简称HOC)来扩展,而vue需要通过mixins来扩展
React刚开始也有mixin的写法,通过React.createClass的api,不过现在很少用了。
Vue也不是不能实现高阶组件,只是特别麻烦,因为Vue对与组件的option做了各种处理,想实现高阶组件就要知道每一个option是怎么处理的,然后正确的设置。具体有多复杂,可以参考下面的文章。
状态管理
- react做的事情很少,很多都交给社区去做,vue很多东西都是内置的,写起来确实方便一些,
比如 redux的combineReducer就对应vuex的modules,
比如reselect就对应vuex的getter和vue组件的computed,
vuex的mutation是直接改变的原始数据,而redux的reducer是返回一个全新的state,所以redux结合immutable来优化性能,vue不需要。
5.事件绑定
react采用框架封装的合成事件,兼容底层浏览器差异,比如onClick,
vue使用v-on或@的写法
总结:
- react整体的思路就是函数式,所以推崇纯组件,数据不可变,单向数据流,当然需要双向的地方也可以做到,比如结合redux-form
- 而vue是基于可变数据的,支持双向绑定。react组件的扩展一般是通过高阶组件,而vue组件会使用mixin。vue内置了很多功能,而react做的很少,很多都是由社区来完成的,
- vue追求的是开发的简单,而react更在乎方式是否正确。
网友评论