vue2和vue3对比(语法层面)

阅读文章你将收获:

1 了解不使用组件化工具时,vue在html是如何使用的

2 知道vue2的生命周期函数有哪些

3  知道如何在组件化开发中使用vue

4  大致了解了vue2和vue3在使用上什么不同

最后:vue2和vue3除了下面我列出的有差异化的地方,还有其他地方不一样,比如vue2中只能有一个根组件,而vue3不做限制,对于一些细致的地方需要自己去详细了解........

原生的vue结构

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h3>{{ title }}</h3><div><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button><div>计算属性:{{doubleCount}}</div><div> 响应式数据: {{count}} </div><div><button @click="changeAge"> 修改对象的年龄</button></div></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({// 通过el绑定对象,el里面可以填一个选择器el: '#app',// 声明响应式数据data: {count: 100,title: '计数器',obj: {name: 'jack',age: 18}},// 声明计算属性computed: {// 简单写法,属性只读doubleCount () {return this.count * 2},//  复杂写法,可以修改属性值(特殊场景使用一般不用)doubleCountPlus: {get() {return this.count * 2},set(value) {return value}}},// 声明方法methods: {saiHello () {console.log('hello');},changeAge () {// 修改对象的年龄this.obj.age = 20}},// 监视器 -监视数据变化watch: {// 简单写法count (oldValue,newValue) {console.log(oldValue,newValue);},// 完整写法 --obj: {deep: true,       //深度监视,可以监听到数据中的对象属性的变化(这里是基本变量,所以)immediate: true,  //立刻执行handler (newValue) {console.log(newValue);}}},// vue的生命周期函数// 1. 创建阶段(准备数据)beforeCreate(){console.log('数据未初始化之前'+this.count);},created(){console.log('数据完成初始化后'+this.count);},// 2. 挂载阶段(渲染模板)beforeMount(){console.log('渲染模板之前'+document.querySelector('span').innerHTML);},mounted(){console.log('渲染模板之后'+document.querySelector('span').innerHTML);},// 3. 更新阶段(修改数据 → 更新视图)beforeUpdata(){console.log('数据变化之前'+this.count);},updated(){console.log('数据变化之后'+this.count);},// 4. 卸载阶段beforeDestroyed(){console.log('对象销毁之前'+this.count);},destroyed(){console.log('对象销毁之后'+this.count);}})</script>
</body>
</html>

 vue2组件化结构

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'Vue.config.productionTip = falsenew Vue({router,store,render: h => h(App)
}).$mount('#app')

App.vue

<template><div id="app"><router-view/></div>
</template><style lang="less"></style>

vuex

import Vue from 'vue'
import Vuex from 'vuex'// 注册仓库
Vue.use(Vuex)// 导出仓库
export default new Vuex.Store({state: {},getters: {},mutations: {},actions: {},modules: {}
})

 router

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = [{ path: '/home', component: () => import('@/views/home.vue') }
]const router = new VueRouter({routes
})export default router

 home组件

<template><div><div>这是home组件</div><span>666</span><div>响应式数据:{{ count }}</div><div><button @click="saiHello">调用saiHello方法</button></div><div>计算属性{{ doubleCount }}</div><div>  {{ doubleCountPlus  }}<button @click="doubleCountPlus = 60 ">修改计算属性</button></div><div><button @click="changeAge">修改obj的年龄触发监视器</button></div></div>
</template><script>
export default {name: 'homeIndex',// 定义响应式数据data () {return {count: 10,list: [],obj: {name: 'jack',age: 18}}},// 定义方法:methods: {saiHello () {console.log('hello,vue2')},changeAge () {this.obj.age++}},// 定义计算属性computed: {// 简化版doubleCount () {return this.count * 2},// 完整版  (在特定的场景使用)doubleCountPlus: {get () {return this.count * 5},set (value) {console.log(value)}}},// 定义监视器watch: {count (oldValue, newValue) {console.log(oldValue, newValue)},obj: {// 立即执行immediate: true,deep: true,handler (newValue) {console.log(newValue)}}},// vue的生命周期函数// 1. 创建阶段(准备数据)beforeCreate () {console.log('数据未初始化之前' + this.count)},created () {console.log('数据完成初始化后' + this.count)},// 2. 挂载阶段(渲染模板)beforeMount () {console.log('渲染模板之前' + document.querySelector('span').innerHTML)},mounted () {console.log('渲染模板之后' + document.querySelector('span').innerHTML)},// 3. 更新阶段(修改数据 → 更新视图)beforeUpdata () {console.log('数据变化之前' + this.count)},updated () {console.log('数据变化之后' + this.count)},// 4. 卸载阶段beforeDestroyed () {console.log('对象销毁之前' + this.count)},destroyed () {console.log('对象销毁之后' + this.count)}}
</script><style></style>

 vue3组件化结构

mian.js


import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'const app = createApp(App)app.use(createPinia())
app.use(router)app.mount('#app')

App.vue

<script setup>
</script><template><RouterView />
</template><style scoped></style>

router(路由)

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/home', component: () => import('@/views/home.vue')},{path: '/login', component: () => import('@/views/login.vue')}]
})export default router

pinia(仓库)

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', () => {const count = ref(10)const doubleCount = computed(() => count.value * 2)function increment() {count.value++}return { count, doubleCount, increment }
})

 vue3_home组件

<script setup>
import { computed, onBeforeMount, onBeforeUnmount, onMounted, onUnmounted, onUpdated, reactive, ref, watch } from "vue";
import testComponent from '@/components/testComponent.vue'// 导入仓库内容
import { useCounterStore } from "@/stores/counter";
import { onBeforeRouteLeave, useRoute, useRouter } from "vue-router";
// 实例化仓库对象
const counter = useCounterStore()
console.log('输出仓库对象count' + counter.count)const route = useRoute()
const router = useRouter()
const login = () => {router.push(`/login?name=${obj.name}`)
}
//  定义响应式数据
const count = ref(10)
// 使用reactive定义的响应式数据可以直接通过对象获取属性obj.name
const obj = reactive({age: 18,name: '李四'
})// 定义方法
const saiHello = () => {console.log('hello,vue3');
}
function changeCount () {count.value++
}
const changeName = () => {obj.age++
}//定义计算属性
const doubleCount = computed(() => {return count.value * 3
})
// 计算属性的完整写法
const doubleCountPlus = computed({get () {return count.value * 4},set (value) {return count.value * value}
})//watch 监视器 watch(obj,(oldValue,newValue) => {console.log(oldValue, newValue);
},{deep: true,immediate: true
})// vue的生命周期函数// 这二个方法在vue3中被setup语法糖替代了// function beforeCreate(){// console.log('数据未初始化之前'+this.count);// }// function created(){// console.log('数据完成初始化后'+this.count);// }// 2. 挂载阶段(渲染模板)onBeforeMount(() => {console.log('渲染模板之前');}) onMounted(() => {console.log('渲染模板之后');})// 3. 更新阶段(修改数据 → 更新视图)onBeforeRouteLeave(() => {console.log('数据变化之前');})onUpdated(() => {console.log('数据变化之后');})// 4. 卸载阶段onBeforeUnmount(() => {console.log('对象销毁之前');})onUnmounted(() => {console.log('对象销毁之前');})
</script><template><div>我是home页面</div><div><button @click="saiHello">saiHello</button></div><div>count变量:{{ count }} <button @click="changeCount">+</button> </div><div>计算属性:{{ doubleCount }} </div><div>age:<button @click="changeName">+</button></div><div>obj:{{obj}}</div><testComponent>v-我是默认插槽的内容<template v-slot:test>我是具名插槽的内容</template></testComponent><div>{{ counter.count }}</div><button @click="login">点击按钮跳转到登录页</button></template><style scoped></style>

 

vue2和vue3不同点总结

指令

  • 相同点: v-html,v-show,v-if ,v-else,v-esle-if,v-bind,v-on 

        这七个指令的用法和简写方式不管是在vue2还是vue3用法都是一样的

  • 不同点:

        v-model

                作用于表单元素,用法一样

        作用于其他元素

                vue2       ===                      :value属性input事件

                vue3:   =====                  :valuemode属性和:update:modelValue事件

响应式数据

在vue中,要想将变量定义成响应式数据,需要将变量定义到data中

在vue中如果要定义响应式数据,需要使用ref()和reactive()这二个函数来定义

methods方法

在vue2中,所有的不同方法都需要写在选项methos中

在vue3引入了组合式api的概念,只要在<script setup></script>加入了setup这个语法糖,那么就可以将普通方法和变量定义到script的里面

computed计算属性

在vue2中,要定义计算属性,需要将方法或者对象定义到computed选项中

在vue3中,要定义计算属性,需要将方法或者对象定义到computed()函数中

watch监听器

在vue2中,要定义计算属性,需要将方法或者对象定义到watch选项中

在vue3中,要定义计算属性,需要将方法或者对象定义到watch()函数中

生命周期函数

组件通信

父子关系的组件通信:

相同点:同样是使用props和emit来实现

不同点:在vue中要获取pros和emit这二个对象需要通过defineProps和defineEmits这二个自定义宏来获取

获取dom元素

在vue2中使用ref和refs来绑定和获取dom元素

在vue3获取绑定对象

声明变量

 绑定dom元素

插槽

vue2和vue3中插槽的用法是一样的

声明:

使用:

路由

相同点:

1  都是使用vue-router这个插件来实现路由来切换页面

2   声明式导航 (router-link)的用法是一样的

不同点:

  • 初始化路由的方式不一样

  • 编程路由获取和使用方式不一样

 vue2:通过$route和$router(都是内置的对象)

获取路由参数: $route

编程式路由跳转:$router

vue3:通过useRoute和useSouter这二个函数来获取route和router对象

仓库:

vuex

vue2中使用vuex来管理 vue 通用的数据 (多组件共享的数据)

官网:Vuex官网

定义:

使用:

获取仓库变量:

调用仓库的mutatios方法 

 

调用仓库的actions方法

带哦用仓库的getters属性

pinia

vue3中使用pinia来管理 vue 通用的数据 (多组件共享的数据)

官方文档: Pinia

pinia和vuex的用法用法基本一样,但不同的是在pinia中没有moudel和mutatios这二个选项

,然后使用的方式也有一些小差别,想了解更多可以查看上面的官网

声明:

使用:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/264363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】学习笔记03-循环语句

3.1 whlie循环的基础语法 - while循环的语法格式 - while循环的注意事项 条件需提供布尔类型结果&#xff0c;True继续&#xff0c;False停止 空格缩进不能忘 请规划好循环终止条件&#xff0c;否则将无限循环 """ 演示while循环基础练习题&#xff1a;求1-10…

蜂邮EDM-新手教程-新手也能使用

一、登录注册账号&#xff0c;注册登录地址&#xff1a;fengemail.com 二、配置邮箱 选择“账号设置”——“邮箱设置”进行发信邮箱配置。每个账号将默认存在一个“系统默认接口”&#xff0c;点击右侧的编辑按钮即可对该配置进行修改。 注&#xff1a;发信邮箱暂不支持个人…

本博客工程源码总目录----方便你快速找到自己喜欢的项目

目录 1、前言2、本人项目总分类3、FPGA图像处理类项目-->快速查找3.1、图像采集-->MIPI视频类3.2、图像采集-->SDI视频类3.3、图像采集-->PAL视频类3.4、图像采集-->Cmeralink视频类3.5、图像转换-->LVDS视频转换3.6、图像缩放&#xff08;纯Verilog版本HLS版…

设计模式(七)装饰模式

相关文章设计模式系列 1.装饰模式简介 装饰模式介绍 装饰模式是结构型设计模式之一&#xff0c;不必改变类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的功能&#xff0c;是继承的替代方案之一。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象…

从软硬件以及常见框架思考高并发设计

目录 文章简介 扩展方式 横向扩展 纵向扩展 站在软件的层面上看 站在硬件的层面上看 站在经典的单机服务框架上看 性能提升的思考方向 可用性提升的思考方向 扩展性提升的思考方向 文章简介 先从整体&#xff0c;体系认识&#xff0c;理解高并发的策略&#xff0c;方…

嵌入式Qt 实现用户界面与业务逻辑分离

一.基本程序框架一般包含 二.框架的基本设计原则 三.用户界面与业务逻辑的交互 四.代码实现计算器用户界面与业务逻辑 ICalculator.h #ifndef _ICALCULATOR_H_ #define _ICALCULATOR_H_#include <QString>class ICalculator { public:virtual bool expression(const QSt…

新版Java面试专题视频教程——多线程篇①

新版Java面试专题视频教程——多线程篇① Java多线程相关面试题 0. 问题汇总0.1 线程的基础知识0.2 线程中并发安全 1.线程的基础知识1.1 线程和进程的区别&#xff1f;1.2 并行和并发有什么区别&#xff1f;1.3 创建线程的四种方式1.4 runnabl…

阿里开源低代码引擎 - Low-Code Engine

阿里开源低代码引擎 - Low-Code Engine 本文主要介绍如何在Windows运行/开发阿里开源低代码引擎 - Low-Code Engine 详细文档参见【 阿里开源低代码引擎 - Low-Code Engine 官方文档】 目录 阿里开源低代码引擎 - Low-Code Engine一、环境准备1、使用 WSL 在 Windows 上安装 L…

8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;通过逆向分析确定游戏明文接收数据过程 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;bcf7559184863febdcad819e48aa…

小红书关键词爬虫

标题 1 统计要收集的关键词,制作一个文件夹2 爬取每一页的内容3 爬取标题和内容4 如果内容可以被查看,爬取评论内容5 将结果进行汇总,并且每个帖子保存为一个json文件,具体内容6 总结1 统计要收集的关键词,制作一个文件夹 例如,我要收集旅游相关的,就收集: 旅游、旅行…

工厂方法模式Factory Method

1.模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类 2.使用场景 1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展其内部组件的方法时 主要优点&#xff1a; 1.将具体产品和创建…

树的基本概念和结构

目录 树的概念和结构 树的相关概念 树的特点 树的表示 树的基本应用 树的概念和结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合 &#x1f4cc; 把它叫做树是因为它看起来像一棵倒挂的树&#x…

BUGKU-WEB 文件包含

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 你说啥我就干啥&#xff1a;点击一下试试你会想到PHP伪协议这方面去嘛&#xff0c;你有这方面的知识储备吗&#xff1f; 相关工具 解题步骤 查看源码 看到了一点提示信息&#xff1a; ./index.…

C/C++文件操作

一、文本文件操作 1、写文件操作 代码 #include<fstream> #include<iostream>int main() {ofstream outfile("Student.txt", ios::out);if (!outfile) {cout << "文件写入失败" << endl;exit(0); //程序终止}cout << &qu…

1995-2021年全国30省能源消费总量(万吨标煤)

1995-2021年全国30省能源消费总量&#xff08;万吨标煤&#xff09; 1、时间&#xff1a;1995-2021年 2、范围&#xff1a;30省市不含西藏 3、来源&#xff1a;能源统计年鉴 各省年鉴 3、指标: 能源消费总量 4、单位&#xff1a;万吨标煤 5、缺失情况&#xff1a;新疆202…

JSON(javaScript Object Notation,Js对象标记)—我耀学IT

Json是一种轻量级的数据交换格式&#xff0c;目前使用非常广泛&#xff0c;是一种轻量级的数据交换格式。易于人阅读和编写&#xff0c;可以在多种语言之间进行数据交换 。同时也易于机器解析和生成 1.1json的值: 值可以是对象、数组、数字、字符串或者三个字面值(false、nul…

3分钟看懂设计模式01:策略模式

一、什么是策略模式 定义一些列算法类&#xff0c;将每一个算法封装起来&#xff0c;并让它们可以互相替换。 策略模式让算法独立于使用它的客户而变化&#xff0c;是一种对象行为型模式。 以上是策略模式的一般定义&#xff0c;属于是课本内容。 在没有真正理解策略模式之…

《数据治理简易速速上手小册》第3章 数据质量管理(2024 最新版)

文章目录 3.1 数据质量的定义和标准3.1.1 基础知识3.1.2 重点案例&#xff1a;电商平台的数据清洗3.1.3 拓展案例 1&#xff1a;医疗保健机构的数据整合3.1.4 拓展案例 2&#xff1a;金融服务公司的交易数据监控 3.2 数据质量控制的方法与工具3.2.1 基础知识3.2.2 重点案例&…

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp&#xff0c;ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

vue2和vue3 setup beforecreate create生命周期时间比较

创建一个vue程序&#xff0c;vue3可以兼容Vue2的写法&#xff0c;很流畅完全没问题 写了一个vue3组件 <template><div></div> </template><script lang"ts"> import {onMounted} from vue export default{data(){return {}},beforeCr…