从vue2学习vue3

news2025/1/10 16:13:24

vue3与vue2的区别

Vue 3在写法上与Vue 2有一些区别,以下是一些常见的区别:

引入方式:Vue 2使用Vue全局对象进行引入,而Vue 3使用createApp函数创建应用实例。

组件注册:Vue 2中使用Vue.component全局方法或在选项中使用components属性注册组件,而Vue 3中使用app.component方法进行组件注册。

模板语法:

Vue 2使用基于字符串的模板语法,例如<template>标签中的{{}}和v-指令。
Vue 3支持基于字符串的模板语法,但更推荐使用基于JSX的语法或使用<template>标签中的v-bind和v-on指令。
响应式数据:

Vue 2使用data选项定义响应式数据,需要使用this关键字来访问。
Vue 3中,使用setup函数来定义响应式数据,直接以函数的形式返回,并使用ref、reactive等函数进行包装,访问时无需使用this关键字。
生命周期钩子:Vue 3废弃了Vue 2中的一些生命周期钩子(如beforeCreate、beforeMount等),并引入了新的生命周期钩子(如onBeforeMount、onMounted等)。

插槽:Vue 2使用具名插槽和作用域插槽来实现组件之间的内容分发,而Vue 3引入了<slot>标签中的v-slot指令来代替Vue 2中的具名插槽和作用域插槽。

过滤器:Vue 2中可以使用过滤器对数据进行格式化处理,而Vue 3中移除了过滤器的概念,推荐使用计算属性或方法来处理数据格式化。

需要注意的是,虽然Vue 3在语法和用法上有一些变化,但它仍然保持了与Vue 2的高度兼容性,大部分Vue 2的代码可以迁移到Vue 3中,并且可以逐步采用Vue 3的新特性。

如果setup语法糖与普通的vue写法想一起用就写两个script标签。

<template>
  <!-- Your template here -->
</template>

<script setup>
  // Your setup function here
</script>

<script>
export default {
  name: 'YourComponentName'
}
</script>

<style scoped>
  /* Your styles here */
</style>

组合式API

与vue2的最大区别就是生命钩子函数,自定义变量与函数都可以在script标签中直接定义,但是:

变量接收ref函数的返回对象,更改时要用val.value="xxx"的方式进行更改。

对象要用reactive函数的返回对象。

与vue2中的自定义函数不一样,这里的自定义函数的this是undefine。

<template>
  <div class="hello">
    <h1>{{ xin }}</h1>
    <h1>{{ obj.msg }}</h1>
    <button @click="fun">按钮</button>
  </div>
</template>

<script setup>
import { reactive, ref } from "vue";

const xin = ref("李义新");
const obj = reactive({
  msg: "hello",
});

//这里的函数this是undefine
const fun = () => {
  xin.value = "李义新655";
};
</script>

<style scoped></style>

路由

1、编写路由配置,src/router/router.js中。

2、创建与配置Vue Router实例,src/router/index.js中。

3、把路由配置到Vue,main.js中。

//router.js

import Register from '@/view/register.vue'
import Login from '@/view/login.vue'

const routes = [
    {
        name: 'login',
        path: '/login',
        component: Login
    },
    {
        name: 'register',
        path: '/register',
        component: Register
    }
];
export default routes
//index.js

//哈希模式,带#的
import { createRouter, createWebHashHistory } from 'vue-router';
import routes from './router'; // 导入 router 目录下的 router.js

const router = createRouter({
  history: createWebHashHistory(),
  routes
});

export default router;

//-------------------------------------------------------------------------

//历史模式,不带#的​
import {createRouter, createWebHistory} from 'vue-router'
import routes from './router'    // 导入 router 目录下的 router.js

const router = createRouter({
	history: createWebHistory(process.env.BASE_URL),
	routes
})
export default router;

​
//main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index' // 加载 router 底下的 index.js 路由配置文件

const app = createApp(App)
app.use(router)		
app.mount('#app')

全局方法与变量

Vue2中

定义全局方法与变量是写在new Vue之前。

使用时,在方法中this.Utils....;

Vue3中

 定义全局方法与变量是写在创建App之前,在挂载app.aount*‘#app’)之后。

//定义时
const app = createApp(App);

app.config.globalProperties.Utils = Utils;

app.use(router)
app .mount('#app')

//其它组件使用时
import {getCurrentInstance} from "vue";
const {proxy} = getCurrentInstance();  //proxy是固定写法
const Utils = proxy.Utils;

父子组件的相互调用

父组件

<template>
  <div :style="{backgroundColor: 'black', padding: '20px 0px',color:'white'}">
    <Son ref="sonRef"
         :msg="myMsg"
         @opParent="parentMethod"
    ></Son>
    <hr/>
    <button @click="opSun">调用子组件</button>
    <h2>父组件,子组件传过来的参数:{{sonMsg}}</h2>
  </div>

</template>

<script setup>
import {ref} from 'vue'
import Son from "@/view/Son.vue";

const myMsg = ref("我是父组件传进来的参数");

//sonRef是Son的ref,名字一定要相同,用法很奇怪
const sonRef = ref();

//父组件调用子组件方法
const opSun = () => {
  //通过ref调用子组件的方法,都必须子组件通过defineExpose去暴露一下
  sonRef.value.ParentSon("666");
}

//用于介绍子组件传过来的参数
const sonMsg = ref("");

//子组件调用父组件的回调函数
const parentMethod = (e) => {
  console.log(e);
  sonMsg.value = e;
}

</script>

<style scoped>

</style>

子组件

<template>
  <div :style="{background:'red',color:'white'}">
    <div>子组件:我是父组件传入的参数:{{ msg }}</div>
    <div>子组件:我是父组件调用子组件传入的参数:{{ msg2 }}</div>
    <button @click="opParent">调用父组件</button>
  </div>
</template>

<script setup>

import {ref, defineProps, defineExpose, defineEmits} from "vue"

const props = defineProps({
  msg: {
    type: String,
    default: "www"
  }
})

const msg2 = ref("");

const ParentSon = (parentMsg) => {
  msg2.value = parentMsg;
}

const emit = defineEmits();

const opParent = () => {
  emit("opParent", "我是子组件传过来的");
}

defineExpose({
  ParentSon
})

</script>

<style scoped>

</style>

生命钩子

下述列表中没有 beforeCreate 和 created 的对应项。这是因为在Vue 3中,你不再需要这两个生命周期钩子,因为可以直接在 setup() 函数中执行这些生命周期钩子中的代码。

使用这些生命周期钩子的时候必须要从vue中引入。

beforeCreate => 无对应(在 setup() 开始之前运行)
created => 无对应(在 setup() 结束时运行)
beforeMount => onBeforeMount
mounted => onMounted
beforeUpdate => onBeforeUpdate
updated => onUpdated
beforeUnmount => onBeforeUnmount
unmounted => onUnmounted
errorCaptured => onErrorCaptured
renderTracked => onRenderTracked
renderTriggered => onRenderTriggered
这些生命周期钩子可以在Vue 3的 setup() 函数中

Vuex 

vue3安装vuex

npm install vuex@next

创建store/index.js,用于配置vuex

import {createStore} from "vuex";

const store = createStore({
    state() {
        return {
            count: 0
        }
    },
    mutations: {
        increment(state) {
            state.count++;
        }
    }
})

export default store;

main.js

import {createApp} from 'vue'
import App from './App.vue'
import store from './store'

const app = createApp(App)
app.use(store)
app.mount('#app')

parent来使用vuex

<template>
  <h2>{{ count }}</h2>
  <button @click="increment">点击</button>
</template>

<script setup>

import {computed} from 'vue'
import {useStore} from 'vuex'

const store = useStore()

const count = computed(() => store.state.count)

const increment = () => {
  store.commit('increment')
}

</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python用if-else实现【猜数字】

文章目录 Python 猜数字案例代码实现&#xff1a;运行效果&#xff1a; Python 猜数字案例 设置一个范围1-100的随机整数变量&#xff0c;通过while循环&#xff0c;配合input语句&#xff0c;判断输入的数字是否等于随机数 无限次机会&#xff0c;直到猜中为止每一次猜不中&am…

1.Springboot基础篇笔记

Springboot基础篇 1.快速上手Springboot 1.基础配置 1.parent 通过配置指定父工程依赖为spring-boot-starter-paerent实现了版本管理的功能&#xff0c;再导入springboot整合其他技术的jar包即可 作用&#xff1a;指定jar包版本信息信息&#xff0c;避免依赖版本冲突 这个s…

理解 flask中request中form、data、json、values属性的区别

flask的request对象中关于请求参数的获取有几个不同的属性,例如 args、form、data、json。估计大部分人一开始也分不清什么情况下哪个属性有值,哪个属性没值,这篇文章全面整理了这几个属性之间的区别和使用场景。 flask.request对象其实是对HTTP请求的一种封装,我们知道HT…

Fidder抓包工具基础+postman调试测试

1、下载地址 汉化Fiddler Web Debugger(5.0.20192.25092)中文版 2、配置参数初始化 开启 fidder 百度即可 3、抓包 核心&#xff1a; 入参 出参 4、如何把包的数据放到postman发生请求 保存一个文件&#xff0c;选择格式 保存文件 自定义名称 将har 包托人 postman 即可 &…

华为OD机试真题B卷 Python 实现【箱子之形摆放】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c;例如&#xff1a;箱子ABCDEFG&am…

Autosar诊断实战系列08-Dem与BswM在ECU运行期间究竟擦出了哪些火花

本文框架 前言1. Dem与BswM交互内容先睹为快2 Dem与BswM交互的配置开发2.1 ESH_DemInit Rule2.2 Dem_Shutdown的处理规则3. Dem在初始化及Shutdown期间的工作内容3.1 Dem初始化期间工作内容3.2 Dem_ShutDown期间工作内容前言 在本系列笔者将结合工作中对诊断实战部分的应用经验…

九齐NY8A051D硬件IR模块的配置和使用以及解码处理

写在前面 最近在群里有看到有小伙伴在问九齐的硬件IR模块&#xff0c;突然想起来我好像用过&#xff0c;找了半天才把项目找出来&#xff0c;写篇博客记录一下方便下次使用和寻找。 按道理来说九齐所有内置硬件IR模块的MCU都是可以用类似的方法配置和使用的&#xff0c;举一反…

packaged_task创建异步任务

本文将介绍基本的packaged_task的用法&#xff1a; 看完上述代码后一定有疑问&#xff1a; 为什么要有packaged_task&#xff1f; 解答&#xff1a;上文的线程通信代码如下&#xff1a; 功能主要是做了求两数之和&#xff0c;然而一般情况下&#xff0c;我们并不习惯这样编写子…

Hive(15):Table(表)DDL操作

1 Describe table Hive中的DESCRIBE table语句用于显示Hive中表的元数据信息 describe formatted [db_name.]table_name; describe extended [db_name.]table_name; 如果指定了EXTENDED关键字,则它将以Thrift序列化形式显示表的所有元数据。如果指定了FORMATTED关键字,则它…

大数据Doris(五十三):MySQL Dump 导出

文章目录 MySQL dump 导出 一、Dump导出案例 二、注意事项 MySQL Dump 导出 mysqldump是一个常用的 MySQL 数据库备份工具&#xff0c;它可以将 MySQL 数据库中的数据导出为 SQL 格式的文件&#xff0c;从而实现对数据的备份、迁移和恢复等操作。Doris 在0.15 之后的版本已…

Flutter 实现任意控件拖动功能

文章目录 前言一、如何实现&#xff1f;1、使用GestureDetector响应拖动事件2、使用Transform变换控件位置3、计算活动区域 二、完整代码三、使用示例1、基本用法 总结 前言 使用flutter开发是需要控件能拖动&#xff0c;比如画板中的元素&#xff0c;或者工具条&#xff0c;搜…

递归入门-数据结构和算法教程

什么是递归&#xff1f; 函数直接或间接调用自身的过程称为递归&#xff0c;相应的函数称为递归函数。使用递归算法&#xff0c;某些问题可以很容易地解决。这样的问题的示例是河内塔&#xff08;TOH&#xff09;、中序/前序/后序树遍历、图的DFS等。递归函数通过调用自身的副…

网络安全(黑客)自学建议

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

基于微信小程序的英语单词记忆系统的设计与实现(论文+源码)_kaic

摘 要 当前时期&#xff0c;国内的经济获得了非常快速的发展&#xff0c;互联网技术在持续的创新和完善&#xff0c;教育教学方面也在不断的进步&#xff0c;教育全面深化改革在发展&#xff0c;并且移动互联网技术在教育领域获得了大量的实践以及应用。语言的全球化慢慢的变…

【算法】01背包和完全背包

文章目录 背包问题概览01背包二维dp数组写法一维dp数组写法 完全背包关于遍历顺序相关题目[416. 分割等和子集](https://leetcode.cn/problems/partition-equal-subset-sum/)[279. 完全平方数](https://leetcode.cn/problems/perfect-squares/)[518. 零钱兑换 II](https://leet…

【webrtc】vs2017 重新构建m98

配置了一台13900k的主机,需要重新配置webrtc 构建环境代码已经gclient sync 同步好了,打算重新构建:vs2017 的win10 sdk最大17763 vs2017 环境 set vs2017_install=S:\Program Files (x86)\Microsoft Visual Studio\2017\Communitywin10 SD

Python_上下文管理器

目录 上下文管理器类 多上下文管理器 contextmanager实现上下文管理器 上下文管理器(context manager)是 Python 编程中的重要概念&#xff0c;用于规定某个对象的使用范围。一旦进入或者离开该使用范围&#xff0c;会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语…

【Kubernetes资源篇】ConfigMap配置管理中心详解

文章目录 一、ConfigMap配置中心理论知识1、ConfigMap配置中心简介2、ConfigMap局限性 二、创建ConfigMap的四种方式1、第一种&#xff1a;通过命令行创建ConfigMap2、第二种&#xff1a;通过指定文件创建ConfigMap3、第三种&#xff1a;通过指定目录创建ConfigMap4、第四种&am…

C++线程池(1)理论基础及简单实现

写过CURD的程序员肯定都熟悉“数据库连接池”这个东西&#xff0c;数据库连接是个昂贵的东西&#xff0c;因为它的创建过程比较耗费资源。所以为了节约资源、提高数据库操作的性能&#xff0c;“数据库连接池”就应运而生了。 其实线程池跟数据库连接池类似&#xff0c;一个线…

《PyTorch深度学习实践》第七讲 处理多维特征的输入

b站刘二大人《PyTorch深度学习实践》课程第七讲处理多维特征的输入笔记与代码&#xff1a;https://www.bilibili.com/video/BV1Y7411d7Ys?p7&vd_sourceb17f113d28933824d753a0915d5e3a90 Diabetes Dataset 每一行是一个记录每一列是一个特征&#xff0c;每个样本有8个特征…