10分钟让你快速上手Vue3

经过了漫长地迭代,Vue 3.0 终于在上 2020-09-18 发布了,带了翻天覆地的变化,使用了 Typescript 进行了大规模的重构,带来了 Composition API RFC 版本,类似 React Hook 一样的写 Vue,可以自定义自己的 hook ,让使用者更加的灵活,接下来总结一下 vue 3.0 带来的部分新特性。

创新互联专注于企业全网营销推广、网站重做改版、灯塔网站定制设计、自适应品牌网站建设、H5网站设计成都做商城网站、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为灯塔等各大城市提供网站开发制作服务。

  1. setup()
  2. ref()
  3. reactive()
  4. isRef()
  5. toRefs()
  6. computed()
  7. watch()
  8. LifeCycle Hooks(新的生命周期)
  9. Template refs
  10. globalProperties
  11. Suspense

Vue2 与 Vue3 的对比

  • 对 TypeScript 支持不友好(所有属性都放在了 this 对象上,难以推倒组件的数据类型)
  • 大量的 API 挂载在 Vue 对象的原型上,难以实现 TreeShaking。
  • 架构层面对跨平台 dom 渲染开发支持不友好
  • CompositionAPI。爱 ReactHook 启发
  • 更方便的支持了 jsx
  • Vue 3 的 Template 支持多个根标签,Vue 2 不支持
  • 对虚拟 DOM 进行了重写、对模板的编译进行了优化操作...

一、setup 函数

setup() 函数是 vue3 中,专门为组件提供的新属性。它为我们使用 vue3 的 Composition API 新特性提供了统一的入口, setup 函数会在 beforeCreate 之后、created 之前执行, vue3 也是取消了这两个钩子,统一用 setup 代替, 该函数相当于一个生命周期函数,vue 中过去的 data,methods,watch 等全部都用对应的新增 api 写在 setup()函数中

 
 
 
  1. setup(props, context) { 
  2.     context.attrs 
  3.     context.slots 
  4.     context.parent 
  5.     context.root 
  6.     context.emit 
  7.     context.refs 
  8.  
  9.     return { 
  10.  
  11.     } 
  12.   } 
  • props: 用来接收 props 数据
  • context 用来定义上下文, 上下文对象中包含了一些有用的属性,这些属性在 vue 2.x 中需要通过 this 才能访问到, 在 setup() 函数中无法访问到 this,是个 undefined
  • 返回值: return {}, 返回响应式数据, 模版中需要使用的函数

二、reactive 函数

reactive() 函数接收一个普通对象,返回一个响应式的数据对象, 想要使用创建的响应式数据也很简单,创建出来之后,在 setup 中 return 出去,直接在 template 中调用即可

 
 
 
  1.  
  2.  
  3.  
  4.  import { defineComponent, defineAsyncComponent } from "vue"; 
  5.  const MyComponent = defineAsyncComponent(() => import('./Component')); 
  6.  
  7. export default defineComponent({ 
  8.    components: { 
  9.      MyComponent 
  10.    }, 
  11.    setup() { 
  12.      return {} 
  13.    } 
  14. }) 
  15.  
  16.  
  17.  

十二、vue 3.x 完整组件模版结构

一个完成的 vue 3.x 完整组件模版结构包含了:组件名称、 props、components、setup(hooks、computed、watch、methods 等)

 
 
 
  1.  
  2.  
  3.  
  4. import { computed, defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, toRefs } from 'vue'; 
  5.  
  6. interface IState { 
  7.   count: 0, 
  8.   name: string, 
  9.   list: Array 
  10.  
  11. export default defineComponent({ 
  12.   name: 'demo', 
  13.   // 父组件传子组件参数 
  14.   props: { 
  15.     name: { 
  16.       type: String as PropType
  17.       default: 'vue3.x' 
  18.     }, 
  19.     list: { 
  20.       type: Array as PropType
  21.       default: () => [] 
  22.     } 
  23.   }, 
  24.   components: { 
  25.     /// TODO 组件注册 
  26.   }, 
  27.   emits: ["emits-name"], // 为了提示作用 
  28.   setup (props, context) { 
  29.     console.log(props.name) 
  30.     console.log(props.list) 
  31.  
  32.  
  33.     const state = reactive({ 
  34.       name: 'vue 3.0 组件', 
  35.       count: 0, 
  36.       list: [ 
  37.         { 
  38.           name: 'vue', 
  39.           id: 1 
  40.         }, 
  41.         { 
  42.           name: 'vuex', 
  43.           id: 2 
  44.         } 
  45.       ] 
  46.     }) 
  47.  
  48.     const a = computed(() => state.name) 
  49.  
  50.     onMounted(() => { 
  51.  
  52.     }) 
  53.  
  54.     function handleClick () { 
  55.       state.count ++ 
  56.       // 调用父组件的方法 
  57.       context.emit('emits-name', state.count) 
  58.     } 
  59.  
  60.     return { 
  61.       ...toRefs(state), 
  62.       handleClick 
  63.     } 
  64.   } 
  65. }); 
  66.  
  67.  
  68.  
  69.  
  70.  
  71. import { computed, defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, toRefs } from 'vue'; 
  72.  
  73. interface IState { 
  74.   count: 0, 
  75.   name: string, 
  76.   list: Array 
  77.  
  78. export default defineComponent({ 
  79.   name: 'demo', 
  80.   // 父组件传子组件参数 
  81.   props: { 
  82.     name: { 
  83.       type: String as PropType
  84.       default: 'vue3.x' 
  85.     }, 
  86.     list: { 
  87.       type: Array as PropType
  88.       default: () => [] 
  89.     } 
  90.   }, 
  91.   components: { 
  92.     /// TODO 组件注册 
  93.   }, 
  94.   emits: ["emits-name"], // 为了提示作用 
  95.   setup (props, context) { 
  96.     console.log(props.name) 
  97.     console.log(props.list) 
  98.  
  99.  
  100.     const state = reactive({ 
  101.       name: 'vue 3.0 组件', 
  102.       count: 0, 
  103.       list: [ 
  104.         { 
  105.           name: 'vue', 
  106.           id: 1 
  107.         }, 
  108.         { 
  109.           name: 'vuex', 
  110.           id: 2 
  111.         } 
  112.       ] 
  113.     }) 
  114.  
  115.     const a = computed(() => state.name) 
  116.  
  117.     onMounted(() => { 
  118.  
  119.     }) 
  120.  
  121.     function handleClick () { 
  122.       state.count ++ 
  123.       // 调用父组件的方法 
  124.       context.emit('emits-name', state.count) 
  125.     } 
  126.  
  127.     return { 
  128.       ...toRefs(state), 
  129.       handleClick 
  130.     } 
  131.   } 
  132. }); 
  133.  
  134. vue 3 的生态

    • 官网
    • 源码
    • vite 构建器
    • 脚手架:https://cli.vuejs.org/
    • vue-router-next
    • vuex4.0

    UI 组件库

    • vant2.x
    • Ant Design of Vue 2.x
    • element-plus

    分享名称:10分钟让你快速上手Vue3
    URL地址:http://www.csdahua.cn/qtweb/news45/214295.html

    网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网