Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VUE3.0和VUE2.0语法上的不同

VUE3.0和VUE2.0语法上的不同

作者头像
javascript艺术
发布于 2022-06-08 09:17:42
发布于 2022-06-08 09:17:42
1.5K00
代码可运行
举报
文章被收录于专栏:javascript艺术javascript艺术
运行总次数:0
代码可运行

前言:本篇文章只做VUE3.0和VUE2.0语法上的不同分析,不做性能和源码架构等的分析。

一、VUE3.0和VUE2.0代码结构不同
  • VUE3.0代码实例🌰
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <span>count is {{ count }}</span>
    <span>plusOne is {{ plusOne }}</span>
    <button @click="increment">count++</button>
  </div>
</template>
 
<script>
import { value, computed, watch, onMounted, ref } from 'vue'
 
export default {
  setup() {
    // ref state
    const count = ref(0)
    // computed state
    const plusOne = computed(() => count.value + 1)
    // method
    const increment = () => { count.value++ }
    // watch
    watch(() => count.value * 2, val => {
      console.log(`count * 2 is ${val}`)
    })
    // lifecycle
    onMounted(() => {
      console.log(`mounted`)
    })
    // expose bindings on render context
    return {
      count,
      plusOne,
      increment
    }
  }
}
</script>

也可以不用写setup函数,可以直接把setup写到script标签上

  • VUE3.0代码实例🌰
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <span>count is {{ count }}</span>
    <span>plusOne is {{ plusOne }}</span>
    <button @click="increment">count++</button>
  </div>
</template>

<script setup lang="ts">
import { computed, watch, onMounted, ref } from 'vue'

// ref state
const count = ref(0)
// computed state
const plusOne = computed(() => count.value + 1)
// method
const increment = () => { count.value++ }
// watch
watch(() => count.value * 2, val => {
  console.log(`count * 2 is ${val}`)
})
// lifecycle
onMounted(() => {
  console.log(`mounted`)
})

</script>

  • 相应的VUE2.0代码实例🌰
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <div>
        <span>count is {{ count }}</span>
        <span>plusOne is {{ plusOne }}</span>
        <button @click="increment">count++</button>
    </div>
</template>
 
<script>
    export default {
        data() {
            return {
                count: 0
            };
        },
        methods: {
            increment: function () {
                this.count++;
            }
        },
        computed: {
            plusOne: function () {
                return this.count + 1;
            }
        },
        watch: {
            count: function (val) {
                console.log(`count * 2 is ${val * 2}`)
            }
        },
        mounted() {
            console.log(`mounted`);
        }
    };
</script>

VUE2.0和VUE3.0的代码对比一下:

VUE2.0是将mounted、data、computed、watch之类的方法作为VUE对象的属性进行导出。

VUE3.0新增了一个名为setup的入口函数,value, computed, watch, onMounted等方法都需要从外部import。

evernotecid://CA5E4AF5-56FE-42CC-9E43-67CF1FF3C17E/appyinxiangcom/27675019/ENResource/p130

二、关于VUE3.0和VUE2.0生命周期
  • VUE2.0生命周期 1、beforeCreate:在实例初始化之后、进行数据侦听和事件/侦听器的配置之前同步调用

2、created:在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前尚不可用。

3、beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。

4、mounted:在实例挂载完成后被调用。

5、beforeUpdate:在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。

6、updated:在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。

7、activated:被 keep-alive 缓存的组件激活时调用。

8、deactivated:被 keep-alive 缓存的组件失活时调用。

9、beforeUnmount:在卸载组件实例之前调用。在这个阶段,实例仍然是完全正常的。

10、unmounted:卸载组件实例后调用。调用此钩子时,组件实例的所有指令都被解除绑定,所有事件侦听器都被移除,所有子组件实例被卸载。

  • VUE3.0生命周期

1、setup: 同VUE2.0的beforeCreate和created。

2、onBeforeMount:同VUE2.0的beforeMount。

3、onMounted:同VUE2.0的mounted。

4、onBeforeUpdate:同VUE2.0的beforeMount。

5、onUpdated:同VUE2.0的updated。

6、onBeforeUnmount:同VUE2.0的beforeUnmount。

7、onUnmounted:同VUE2.0的unmounted。

8、onMounted:同VUE2.0的beforeMount。

9、onActivated:同VUE2.0的activated。

10、onDeactivated:同VUE2.0的deactivated。

evernotecid://CA5E4AF5-56FE-42CC-9E43-67CF1FF3C17E/appyinxiangcom/27675019/ENResource/p132

VUE3.0和VUE2.0响应式
  • VUE3.0响应数据

1、ref():让简单类型的数据变成响应式数据。这种数据是Number或者String等基本类型数据,这种数据是通过值而非引用传递的类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref } from 'vue'

const count = ref(0)
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

2、reactive():让复杂类型数据变成响应式,不需要.value包裹。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { reactive } from 'vue'

// 响应式状态
const state = reactive({
  count: 0
})

state.count.value++
console.log(state.count) // 1

注意:当ref作为响应式对象的值被更改时,ref的内部值也会发生改变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const count = ref(0)
const state = reactive({
  count
})

console.log(state.count) // 0

state.count = 1
console.log(count.value) // 1

注意:使用ES6解构响应式对象时,响应式会丢失。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { reactive } from 'vue'

const book = reactive({
  author: 'Vue Team',
  year: '2020',
  title: 'Vue 3 Guide',
  description: 'You are reading this book right now ;)',
  price: 'free'
})

let { author, title } = book

对于这种情况,我们需要将我们的响应式对象转换为一组 ref。这些 ref 将保留与源对象的响应式关联,使用toRefs():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { reactive, toRefs } from 'vue'

const book = reactive({
  author: 'Vue Team',
  year: '2020',
  title: 'Vue 3 Guide',
  description: 'You are reading this book right now ;)',
  price: 'free'
})

let { author, title } = toRefs(book)

title.value = 'Vue 3 Detailed Guide' // 我们需要使用 .value 作为标题,现在是 ref
console.log(book.title) // 'Vue 3 Detailed Guide'
watch监听属性
  • VUE3.0 watch监听
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, watch } from 'vue'

const counter = ref(0)
watch(counter, (newValue, oldValue) => {
  console.log('The new counter value is: ' + counter.value)
})

  • VUE2.0 watch监听
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  data() {
    return {
      counter: 0
    }
  },
  watch: {
    counter(newValue, oldValue) {
      console.log('The new counter value is: ' + this.counter)
    }
  }
}
computed计算属性
  • VUE3.0 computed计算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, computed } from 'vue'

const counter = ref(0)
const twiceTheCounter = computed(() => counter.value * 2)

counter.value++
console.log(counter.value) // 1
console.log(twiceTheCounter.value) // 2
  • VUE2.0 computed计算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue.createApp({
  data() {
    return {
      counter: 0
    }
  },
  computed: {
    twiceTheCounter() {
      return counter * 2
    }
  }
}).mount('#demo')
父子组件通过props传递值
  • VUE3.0 props
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MyBook.vue
export default {
  props: {
    title: String
  },
  setup(props) {
    console.log(props.title)
  }
}

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
const props = defineProps({
  title: {
    type: String
  }
})
</script>
  • VUE2.0 props
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  name: 'Demo',
  props: {
    count: {
      type: Number,
      default: 1
    },
   arrValue: {
      type: Array,
      default () {
        return []
      }
    }
  },
  mounted() {
    console.log(this.count)
  }
 }
emit子组件向父组件抛出事件
  • VUE2.0

VUE2.0可以通过this.$emit()向父组件抛出事件

  • VUE3.0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setup(props, { emit }) {
    const close = ()=>{
        emit("change")    
    }
    return{
        close
    }
}

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
const emit = defineEmits(["change"])

const close = ()=>{
        emit("change")    
    }
</script>
$refs
  • VUE2.0

vue2.0可以直接通过this.$refs.访问子组件

  • VUE3.0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div ref="refDemo" />
</template>
<script setup>
const refDemo = ref()
console.log(refDemo.value)
</script>

注意:1、通过变量的命名要和ref相同。2、通过ref来访问子组件的方法,子组件要通过expose将事件和变量暴露出来,这样父组件才能访问到

VUE3.0 context
  • VUE2.0

VUE2.0可以通过this来访问VUE实例上的方法和变量。例如this.

emitthis.

refs、this.$slots.

  • VUE3.0

context 是一个普通 JavaScript 对象,暴露了其它可能在 setup 中有用的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  setup(props, context) {
    // Attribute (非响应式对象,等同于 $attrs)
    console.log(context.attrs)

    // 插槽 (非响应式对象,等同于 $slots)
    console.log(context.slots)

    // 触发事件 (方法,等同于 $emit)
    console.log(context.emit)

    // 暴露公共 property (函数)
    console.log(context.expose)
  }
}

**注意:在setup时,你只能访问props、attrs、slots、emit。无法访问data、computed、methods、refs (模板 ref)

更多细节可看VUE官方文档:https://v3.cn.vuejs.org/guide/composition-api-setup.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 javascript艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
通过10个实例小练习,快速入门熟练 Vue3 核心新特性
Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了。
夜尽天明
2020/05/13
1.3K0
推荐:非常详细的vue3.0开发笔记(7k字)
当将当前的技术栈从Vue 2.0升级到Vue 3.0时,有许多值得考虑的理由。以下是10个升级到Vue 3.0的理由:
微芒不朽
2023/08/21
5260
推荐:非常详细的vue3.0开发笔记(7k字)
Vue3.0 beta版学习笔记
https://github.com/vuejs/vue-next
用户7572539
2020/08/26
7220
vue3.0新特性初体验(一)
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货!
前端老道
2020/09/08
9090
vue3.0新特性初体验(一)
让你30分钟快速掌握vue 3
经过了漫长的迭代,Vue 3.0终于在上2020-09-18发布了,带了翻天覆地的变化,使用了Typescript 进行了大规模的重构,带来了Composition API RFC版本,类似React Hook 一样的写Vue,可以自定义自己的hook ,让使用者更加的灵活,接下来总结一下vue 3.0 带来的部分新特性。
前端开发博客
2020/11/04
2.4K0
Vue3.0 不畏惧祖传代码的 Composition API
昨晚写这篇文章的时候,隔壁在聚餐,几位女生欢聚一堂,整个楼层充满了欢声笑语的味道,就好像早上刷牙刷一半就跑去吃了个鸡蛋。
用户1890129
2020/12/16
5560
vue3.0 项目搭建和使用流程
这篇文章主要介绍了vue3.0 项目搭建和使用流程,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
米米素材网
2022/07/29
2.3K0
vue3.0 项目搭建和使用流程
初探 Vue 3.0 的组装式 API(一)
Vue3 已经更新到 RC9,正式发布在即,其中让人倍加关注的重大更新:组装式 API (Composition API) 到底是什么,相比 Vue2 又有什么优势呢?
贤羽
2022/06/09
4080
Vue3.0 新特性全面探索 - 基于 Composition Api 快速构建实战项目
建议配合 Visual Studio Code 和 Vue 3 Snippets 代码插件食用Ψ( ̄∀ ̄)Ψ。
wscats
2020/06/06
1.4K0
vue3.0新特性初体验(二)
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货!
前端老道
2020/09/10
9540
vue3.0新特性初体验(二)
Vue3.0 新特性以及使用变更总结(实际工作用到的)
Vue3.0 在去年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。
@超人
2021/03/23
2.6K0
Vue3.0 新特性以及使用变更总结(实际工作用到的)
109.精读《Vue3.0 Function API》
Vue 3.0 的发布引起了轩然大波,让我们解读下它的 function api RFC 详细了解一下 Vue 团队是怎么想的吧!
黄子毅
2022/03/14
3870
Vue3.0入门 + Vant3.0移动端实践(二)轮播图模块封装及首页完善
接着上一篇的来,上一篇介绍了环境搭建及做好了底部的导航栏模块,接下来继续完善首页。
杨永贞
2021/02/22
1.4K0
Vue3.0入门 + Vant3.0移动端实践(二)轮播图模块封装及首页完善
Vue开发仿京东商场app
vue3-jd-h5是一个电商H5页面前端项目,基于Vue 3.0.0 + Vant 3.0.0 实现,主要包括首页、分类页面、我的页面、购物车等,部分效果如下图。
xiangzhihong
2021/01/15
9770
我在vue3.0团队内部的分享
当前还处于 beta版本, 想要正式使用在项目里还需要一段的时间, 但是结构与api变化应该不大了.
肉眼品世界
2021/01/25
5870
精读《Vue3.0 Function API》
Vue 3.0 的发布引起了轩然大波,让我们解读下它的 function api RFC 详细了解一下 Vue 团队是怎么想的吧!
极乐君
2019/07/10
1.1K0
前端系列12集-全局API,组合式API,选项式API的使用
The setup() hook serves as the entry point for Composition API usage in components in the following cases: 在以下情况下, setup() 钩子用作组件中 Composition API 使用的入口点:
达达前端
2023/10/08
5880
Vue3.x 生命周期 和 Composition API 核心语法理解
参考:https://cn.vuejs.org/v2/api/#选项-生命周期钩子
前端老道
2022/03/29
4.3K0
Vue3.x 生命周期 和 Composition API 核心语法理解
vue3.0 源码解析一 :响应式原理(上)
从本文开始,我们正式进入vue3.0 源码解析流程。个人觉得从ceateApp入手并不是最佳的学习方案,所以我们先从composition-api响应式原理入手,共同学习vue3.0带来的哪些翻天覆地的变化。
用户6835371
2021/06/01
5690
vue3.0 源码解析一 :响应式原理(上)
使用Vue3.0,我收获了哪些知识点(二)
最近在工作之余一直学习Vue3.0相关知识,虽然Vue3.0至今还是rc版,但这并不影响我们去学习。今天这篇文章是我关于Vue3.0的第四篇文章。在前文中我们讲解了如何通过vite和vuecli搭建Vue3.0开发环境,然后介绍了Vue3.0中的setup,reactive,ref等,今天这篇文章主要讲解了以下内容:
前端进击者
2021/07/27
1.2K0
相关推荐
通过10个实例小练习,快速入门熟练 Vue3 核心新特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验