vue转react入门指南

目录
  • 设计
  • 组件通信
  • 生命周期
  • 事件处理
  • class和style
    • class
    • style
  • 条件渲染
  • 列表渲染
  • 组件嵌套
  • 获取DOM
  • 文档结构
  • 路由
    • 动态路由&路由传参
  • 嵌套路由
  • 路由跳转
  • 路由守卫(登录验证,特殊路由处理)
  • 状态管理
    • 使用

因为新公司使用react技术栈,包括Umi、Dva、Ant-design等一系列解决方案。稍微熟悉一下之后,了解到虽然有些不同,但是还是大相径庭。以下我就以两个火热的框架react16&vue2(在积极学习vue3中)从设计、书写方式、API、生命周期及热门生态做一下简单的对比:

设计

react vue 说明
定位 构建用户界面的js库 渐进式框架 react侧重于library,vue侧重于framework
渲染 setState更新state的值来达到重新render视图 响应式数据渲染,修改了响应式数据对应的视图也进行渲染 react需要考虑何时setState,何时render;vue只需要考虑修改数据
编写方式 jsx template react是函数式,all in js;vue区分tempalte、script、style,提供语法糖,使用vue-loader编译

组件通信

react:严格的单向数据流

  • 向下 props
  • 向上 props func
  • 多级传递 context

遵循万物皆可props,onChange/setState()

vue:单向数据流

  • 向下 props down
  • 向上 events up(订阅发布)
  • 多级传递 $attrs、$listeners

还有各种获取组件实例(VueComponent),如:$refs、$parent、$children;通过递归获取上级或下级组件,如:findComponentUpward、findComponentsUpward;高阶组件:provide/reject,dispatch/broadcast

react vue 说明
子组件数据传递 props props 都是声明式
组件状态机 state data 管理组件的状态,react使用setState更改,vue直接赋值,新属性使用$set;vue使用函数闭包特性,保证组件data的独立性,react本就是函数

生命周期

react vue 说明
数据的初始化 constructor created
挂载 componentDidMount mounted dom节点已经生成
更新 componentDidUpdate updated react:组件更新完毕后,react只会在第一次初始化成功会进入componentDidmount,之后每次重新渲染后都会进入这个生命周期,这里可以拿到prevProps和prevState,即更新前的props和state。 vue:在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
卸载 componentWillUnmount destroyed 销毁事件

事件处理

react

  • React 事件的命名采用小驼峰式(camelCase),而不是纯小写
  • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串
  • 不能通过返回 false 的方式阻止默认行为。你必须显式的使用 preventDefault
  • 不能卸载非Element标签上,否则会当成props传下去
function Form() {
  function handleSubmit(e) {
    e.preventDefault();
    console.log('You clicked submit.');
  }
  return (
    <form onSubmit={handleSubmit}>
      <button type="submit">Submit</button>
    </form>
  );
}

vue

用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件

//原生事件
<form v-on:submit.prevent="onSubmit"></form>
//自定义事件
<my-component @my-event="handleThis(123, $event)"></my-component>

vue事件修饰符:

  • .stop - 调用 event.stopPropagation()。
  • .prevent - 调用 event.preventDefault()。
  • .capture - 添加事件侦听器时使用 capture 模式。
  • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
  • .native - 监听组件根元素的原生事件。
  • .once - 只触发一次回调。
  • .left - (2.2.0) 只当点击鼠标左键时触发。
  • .right - (2.2.0) 只当点击鼠标右键时触发。
  • .middle - (2.2.0) 只当点击鼠标中键时触发。
  • .passive - (2.3.0) 以 { passive: true } 模式添加侦听器

class和style

class

react

render() {
  let className = 'menu';
  if (this.props.isActive) {
    className += ' menu-active';
  }
  return <span className={className}>Menu</span>
}

vue

<div
  class="static"
  :class="{ active: isActive, 'text-danger': hasError }"
></div>

<div :class="[{ active: isActive }, errorClass]"></div>

style

react

<div style={{color: 'red', fontWeight: 'bold'}} />

vue

<div :style="[baseStyles, overridingStyles]"></div>

组件样式的时候你可以在style标签上声明一个scoped来作为组件样式隔离标注,如:<style lang="sass" scoped></style>。最后打包时其实样式都加入一个hash的唯一值,避免组件间css污染

条件渲染

  • react:jsx表达式, &&或者三元表达式;return false表示不渲染
  • vue:表达式返回true被渲染,可嵌套多个v-else-if,v-else

列表渲染

react:使用.map,一个元素的 key 最好是这个元素在列表中拥有的一个独一无二的字符串

<ul>
  {props.posts.map((post) =>
    <li key={post.id}>
      {post.title}
    </li>
  )}
</ul>

vue:为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute

<li v-for="item in items" :key="item.message">
  {{ item.message }}
</li>

组件嵌套

react

默认插槽

<div className={'FancyBorder FancyBorder-' + props.color}>
  {props.children}
</div>

具名插槽

<div className="SplitPane">
  <div className="SplitPane-left">
    {props.left}
  </div>
  <div className="SplitPane-right">
    {props.right}
  </div>
</div>

<SplitPane left={<Contacts />} right={<Chat />} />

vue

默认插槽

<main>
  <slot></slot>
</main>

具名插槽

<header>
  <slot name="header"></slot>
</header>

获取DOM

react:管理焦点,文本选择或媒体播放。触发强制动画。集成第三方 DOM 库

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}

vue:被用来给元素或子组件注册引用信息

<div ref="div">hello</div>

this.$refs.p.offsetHeight

文档结构

Umi

├── config                   # umi 配置,包含路由,构建等配置
│   ├── config.ts            # 项目配置.umirc.ts优先级更高,使用此方式需要删除.umirc.ts
│   ├── routes.ts            # 路由配置
│   ├── defaultSettings.ts   # 系统配置
│   └── proxy.ts             # 代理配置
├── mock                     # 此目录下所有 js 和 ts 文件会被解析为 mock 文件
├── public                   # 此目录下所有文件会被copy 到输出路径,配置了hash也不会加
├── src
│   ├── assets               # 本地静态资源
│   ├── components           # 业务通用组件
│   ├── e2e                  # 集成测试用例
│   ├── layouts              # 约定式路由时的全局布局文件
│   ├── models               # 全局 dva model
│   ├── pages                # 所有路由组件存放在这里
│   │   └── document.ejs     # 约定如果这个文件存在,会作为默认模板
│   ├── services             # 后台接口服务
│   ├── utils                # 工具库
│   ├── locales              # 国际化资源
│   ├── global.less          # 全局样式
│   ├── global.ts            # 全局 JS
│   └── app.ts               # 运行时配置文件,比如修改路由、修改 render 方法等
├── README.md
└── package.json

vue_cli

├── mock                       # 项目mock 模拟数据
├── public                     # 静态资源
│   └── index.html             # html模板
├── src                        # 源代码
│   ├── api                    # 所有请求
│   ├── assets                 # 主题 字体等静态资源
│   ├── components             # 全局公用组件
│   ├── directive              # 全局指令
│   ├── filters                # 全局 filter
│   ├── layout                 # 全局 layout
│   ├── router                 # 路由
│   ├── store                  # 全局 store管理
│   ├── utils                  # 全局公用方法
│   ├── views                  # views 所有页面
│   ├── App.vue                # 入口页面
│   └── main.js                # 入口文件 加载组件 初始化等
├── tests                      # 测试
├── vue.config.js              # vue-cli 配置如代理,压缩图片
└── package.json               # package.json

路由

动态路由&路由传参

react-router

  • history.push(/list?id=${id})
  • history.push({pathname: '/list', query: {id}})
  • history.push(/list/id=${id})
  • history.push({pathname: '/list', params: {id}})

获取 props.match.query / props.match.params

vue-router

  • this.$router.push({path: '/list', query: {id}})
  • this.$router.push({path: '/list', params: {id}})

获取 this.$router.query / this.$router.params

嵌套路由

-react

{
  path: '/',
  component: '@/layouts/index',
  routes: [
    { path: '/list', component: 'list' },
    { path: '/admin', component: 'admin' },
  ],
}

<div style={{ padding: 20 }}>{ props.children }</div>

使用props.children渲染子路由

vue-router

{
  path: '/user/:id',
  component: User,
  children: [
    {
      path: 'profile',
      component: UserProfile
    },
    {
      path: 'posts',
      component: UserPosts
    }
  ]
}

<div id="app">
  <router-view></router-view>
</div>

使用vue原生组件/<router-view/>组件渲染子路由

路由跳转

umi

<NavLink exact to="/profile" activeClassName="selected">Profile</NavLink>
history.push(`/list?id=${id}`)

vue

<router-link to="/about">About</router-link>
this.$router.push({path: '/list', query: {id}})

路由守卫(登录验证,特殊路由处理)

  • Umi
  • vue-router

全局路由守卫

全局前置守卫:router.beforeEach

 const router = new VueRouter({ ... })
 router.beforeEach((to, from, next) => {
   // ...
 })

全局后置守卫:router.beforeEach

 router.afterEach((to, from) => {
   // ...
 })

状态管理

多个视图依赖于同一状态或来自不同视图的行为需要变更同一状态;才需要使用状态管理机。

dva vuex 说明
模块 namespace modules 解决应用的所有状态会集中到一个比较大的对象,store对象可能变得相当臃肿
单一状态树 state state 唯一数据源
提交状态机 reducer mutations 用于处理同步操作,唯一可以修改 state 的地方
处理异步操作 effects action 调用提交状态机更改状态树

使用

dva: model connect UI

// new model:models/products.js
export default {
  namespace: 'products',
  state: [],
  reducers: {
    'delete'(state, { payload: id }) {
      return state.filter(item => item.id !== id);
    },
  },
};
//connect model
export default connect(({ products }) => ({
  products,
}))(Products);

//dispatch model reduce
dispatch model reduce({
  type: 'products/delete',
  payload: id,
})

如有异步操作,如ajax请求,dispath model effects,然后effects调用model reduce
vuex

// new module
const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})
//bind UI
<input v-model="$store.state[modelesName].name"/>
//commit module mutation
store.commit('increment')

如有异步操作,如ajax请求,dispath module actions,然后actions调用module mutations

store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

到此这篇关于vue转react入门指南的文章就介绍到这了,更多相关vue转react内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解从react转职到vue开发的项目准备

    前言 首先,为什么我需要做这个项目准备工作呢?因为常年习惯React开发的我,最近突然接手了一个Vue项目,而之前基本没有过Vue的实践,这么突兀让还在沉溺于React开发的我进行Vue开发,甚是不习惯,那自然我需要想办法让Vue开发尽量与React相似,这样大概让自己在开发过程中更得心应手吧. 组件开发 特性对比 众所周知,Vue和React都有那么一个特性,那就是可以让我们进行组件化开发,这样可以让代码得到更好的重用以及解耦,在架构定位中这个应该叫纵向分层吧.但是,两个框架开发组件的写法都有

  • React 组件转 Vue 组件的命令写法

    基于目前React和Vue比较火,开发react-to-vue工具的目的是为了进一步提高组件的可复用用性,让组件复用不仅仅局限在一个框架里面 简介 对于react-to-vue工具,转化的是基本的react component,而不是全部的react应用.而基本react component的定义更多是基于props和state来渲染的组件,其中也可以包括发请求. 本文先介绍两个框架的组件共性和不兼容的地方,再介绍react-to-vue的使用和原理.在实际业务中,陆金所100多个的react基

  • vue转react入门指南

    目录 设计 组件通信 生命周期 事件处理 class和style class style 条件渲染 列表渲染 组件嵌套 获取DOM 文档结构 路由 动态路由&路由传参 嵌套路由 路由跳转 路由守卫(登录验证,特殊路由处理) 状态管理 使用 因为新公司使用react技术栈,包括Umi.Dva.Ant-design等一系列解决方案.稍微熟悉一下之后,了解到虽然有些不同,但是还是大相径庭.以下我就以两个火热的框架react16&vue2(在积极学习vue3中)从设计.书写方式.API.生命周期及

  • SpringBoot+Vue项目新手快速入门指南

    目录 1. 项目技术选型 2.数据库设计 3. 后台搭建 3.1 引入依赖 3.2 swagger配置 3.3实体类 3.4 自动填充配置 3.5 Mapper 3.6 service 3.7 controller 4. 前端搭建 4.1 环境搭建 4.1.1 Node环境 4.1.2 项目构建 4.1.3 安装插件 4.1.4 引入插件 4,2.搭建路由 4.3. echarts使用 4.4 element-ui使用 总结 前言:本人目前从事java开发,但同时也在学习各种前端技术,下面是我做

  • Vue 2.0入门基础知识之内部指令详解

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一个非常轻量级的工具,与其说是一个MVVM框架,不如说是一个js库.Vue.js具有响应式编程和组件化的特点.响应式编程,即保持状态和视图的同步,状态也可以说是数据吧:而其组件化的理念与React则一样,即"一切都是组件,组件化思想方便于模块化的开发,是前端领域的一大趋势. 2.内部指令 2-1.v-

  • Vue.js快速入门教程

    像AngularJS这种前端框架可以让我们非常方便地开发出强大的单页应用,然而有时候Angular这种大型框架对于我们的项目来说过于庞大,很多功能不一定会用到.这时候我们就需要评估一下使用它的必要性了.如果我们仅仅需要在一个简单的网页里添加屈指可数的几个功能,那么用Angular就太麻烦了,必要的安装.配置.编写路由和设计控制器等等工作显得过于繁琐. 这时候我们需要一个更加轻量级的解决方案.Vue.js就是一个不错的选择.Vue.js是一个专注于视图模型(ViewModal)的框架.视图模型是U

  • vue.js初学入门教程(2)

    接着上一篇vue慢速入门教程学习. 4.组件使用基础 什么是组件?组件可以理解为可重用的自定义HTML. 可以使用一堆组件来构造大型应用,任意类型的应用界面都可以抽象为一个组件树: 可以把组件代码按照template.style.script的拆分方式,放置到对应的.vue文件中. 组件预定义选项中最核心的几个: 模板(template).初始数据(data).接受的外部参数(props).方法(methods).生命周期钩子函数(lifecycle hooks). 4.1 基本步骤 使用组件首

  • vue、react等单页面项目部署到服务器的方法及vue和react的区别

    最近好多伙伴说,我用vue做的项目本地是可以的,但部署到服务器遇到好多问题:资源找不到,直接访问index.html页面空白,刷新当前路由404...用react做的项目也同样遇到类似问题.现在我们一起讨论下单页面如何部署到服务器? 由于前端路由缘故,单页面应用应该放到nginx或者apache.tomcat等web代理服务器中,千万不要直接访问index.html,同时要根据自己服务器的项目路径更改react或vue的路由地址. 如果说项目是直接跟在域名后面的,比如:http://www.so

  • 干货!教大家如何选择Vue和React

    两者之间的相同之处 同样是基于组件开发的轻量级框架,同样是专注于用户界面的视图view层. 如何选择 1.1 如果喜欢用模板搭建应用(或者有这个想法)选择Vue Vue应用默认的是把markup放在HTML中,数据绑定表达式和Angular一样,采用{{}}的形式,而指令(特殊的HTML属性)用来向模板中添加功能 <div> <p>{{ message }}</p> <button v-on:click="reverseMessage">

  • Spring Boot 快速入门指南

    最近因为项目的缘故,需要接触 Spring Boot,详细的介绍可以参考官方的文档,这里主要根据自己学习的实践进行简单分享.版本:1.3.6 简介 Spring 框架是非常著名的 Java 开源框架,历经十多年的发展,整个生态系统已经非常完善甚至是繁杂,Spring Boot 正是为了解决这个问题而开发的,为 Spring 平台和第三方库提供了开箱即用的设置,只需要很少的配置就可以开始一个 Spring 项目.当然,建议使用 Java 8 来进行开发. Spring Boot 实际上走的是 Se

  • Vue.js快速入门实例教程

    什么是vue vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 一.基本结构 index.html代码: <script src="../vue.js"></script> <div id="app"> {{ message }} </div> <script src="app.js"></script> <

  • C语言堆栈入门指南

    C语言堆栈入门指南 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈.我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助. 首先在数据结构上要知道堆栈,尽管我们这么称呼它,

随机推荐