前端基础--Vue3核心语法

vue的核心语法

简单入门

Vue3向下兼容Vue2语法,且Vue3中的模板中可以没有根标签

<template><div class="person"><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">年龄+1</button><button @click="showTel">点我查看联系方式</button></div>
</template><script lang="ts">export default {name:'App',data() {return {name:'张三',age:18,tel:'13888888888'}},methods:{changeName(){this.name = 'zhang-san'},changeAge(){this.age += 1},showTel(){alert(this.tel)}},}
</script>

Setup函数

在学习以下知识之前我们先了解一下 options api 和 composition api的区别: vue2中使用的是optionsAPI,来定义一个组件内部的一些属性,如methods、data等等; 其缺点往往会在大项目中体现出来,比如一个简单的计数器功能,可能需要在methods内部书写一部分逻辑,在computed内部也书写一部分逻辑,那么问题来了:如果该组件内部有n个这样的小功能,那么此时代码逻辑是十分分散的,并且后期迭代维护面临的问题也是可能修改一个需求需要在不同的属性内部反复查找相关的代码,而compositionAPI的出现就是为了解决这一问题的。

vue3新增的compositionAPI主要就是为了解决API太过于分散的问题,避免一个功能点下的api太过于分散不便于维护,将同一个功能下的api统一放到一个地方,这样一来项目的开发和维护就简便多了。compositionAPI也叫做组合式API,vue3中组合式API的入口就是setup函数;

setupVue3中一个新的配置项,值是一个函数,它是 Composition API “表演的舞台,组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup中。

特点如下:

  • setup函数返回的对象中的内容,可直接在模板中使用。

  • setup中访问thisundefined

  • setup函数会在beforeCreate之前调用,它是“领先”所有钩子执行的。

  • 普通写法[不推荐]

    通过 export default { setup(){ } } 来定义setup函数 , 这种方式不推荐

  • <template><div class="person"><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">年龄+1</button><button @click="showTel">点我查看联系方式</button></div>
    </template><script lang="ts">export default {name:'Person',setup(){// 数据,原来写在data中(注意:此时的name、age、tel数据都不是响应式数据)let name = '张三'let age = 18let tel = '13888888888'// 方法,原来写在methods中function changeName(){name = 'zhang-san' //注意:此时这么修改name页面是不变化的console.log(name)}function changeAge(){age += 1 //注意:此时这么修改age页面是不变化的console.log(age)}function showTel(){alert(tel)}// 返回一个对象,对象中的内容,模板中可以直接使用return {name,age,tel,changeName,changeAge,showTel}}}
    </script>
    语法糖[推荐]
  • <template><div class="person"><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><button @click="changName">修改名字</button><button @click="changAge">年龄+1</button><button @click="showTel">点我查看联系方式</button></div>
    </template><script lang="ts">export default {name:'Person',}
    </script><!-- 下面的写法是setup语法糖 -->
    <script setup lang="ts">console.log(this) //undefined// 数据(注意:此时的name、age、tel都不是响应式数据)let name = '张三'let age = 18let tel = '13888888888'// 方法function changName(){name = '李四'//注意:此时这么修改name页面是不变化的}function changAge(){console.log(age)age += 1 //注意:此时这么修改age页面是不变化的}function showTel(){alert(tel)}
    </script>

    注意:在setup语法中使用 this 会出现unidefined , 在 setup 中你应该避免使用 this,因为它不会找到组件实例。setup 的调用发生在 data property、computed property 或 methods 被解析之前,所以它们无法在 setup 中被获取,这也是为了避免setup()和其他选项式API混淆。

数据响应函数

什么是响应式:响应式指的是,把数据绑定当视图,当数据的值发生改变,视图也会跟着重新渲染。

ref:基础数据响应式函数

VUE3提供了ref函数可以在修改完 数据后自动渲染视图,类似余双向绑定

  • 在js中通过 import {ref} from "vue"; 来声明 ref函数

  • 注意:ref属性在js中要使用.value 取值

<template><div class="person"><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">年龄+1</button><button @click="showTel">点我查看联系方式</button></div>
</template><script setup lang="ts" name="Person">import {ref} from 'vue'// name和age是一个RefImpl的实例对象,简称ref对象,它们的value属性是响应式的。let name = ref('张三')let age = ref(18)// tel就是一个普通的字符串,不是响应式的let tel = '13888888888'function changeName(){// JS中操作ref对象时候需要.valuename.value = '李四'console.log(name.value)// 注意:name不是响应式的,name.value是响应式的,所以如下代码并不会引起页面的更新。// name = ref('zhang-san')}function changeAge(){// JS中操作ref对象时候需要.valueage.value += 1 console.log(age.value)}function showTel(){alert(tel)}
</script>

通过ref获取dom对象

<template><input ref="inputRef" :value="refValue"/>
</template><script setup>import {ref} from "vue";//变量名 inputRef 和 dom元素上的ref="inputRef" 一样,就能获取到dom元素let inputRef = ref(null);console.log(inputRef);</script>

reactive创建:对象类型的响应式数据

对于对象类型可以使用reactive进行响应式函数处理

<template><div class="person"><h2>汽车信息:一台{{ car.brand }}汽车,价值{{ car.price }}万</h2><h2>游戏列表:</h2><ul><li v-for="g in games" :key="g.id">{{ g.name }}</li></ul><h2>测试:{{obj.a.b.c.d}}</h2><button @click="changeCarPrice">修改汽车价格</button><button @click="changeFirstGame">修改第一游戏</button><button @click="test">测试</button></div>
</template><script lang="ts" setup name="Person">
import { reactive } from 'vue'// 数据
let car = reactive({ brand: '奔驰', price: 100 })
let games = reactive([{ id: 'ahsgdyfa01', name: '英雄联盟' },{ id: 'ahsgdyfa02', name: '王者荣耀' },{ id: 'ahsgdyfa03', name: '原神' }
])
let obj = reactive({a:{b:{c:{d:666}}}
})function changeCarPrice() {car.price += 10
}
function changeFirstGame() {games[0].name = '流星蝴蝶剑'
}
function test(){obj.a.b.c.d = 999
}
</script>

注意:其实ref接收的数据可以是:基本类型对象类型。若ref接收的是对象类型,内部其实也是调用了reactive函数

例如:

template><div class="person"><h2>汽车信息:一台{{ car.brand }}汽车,价值{{ car.price }}万</h2><h2>游戏列表:</h2><ul><li v-for="g in games" :key="g.id">{{ g.name }}</li></ul><h2>测试:{{obj.a.b.c.d}}</h2><button @click="changeCarPrice">修改汽车价格</button><button @click="changeFirstGame">修改第一游戏</button><button @click="test">测试</button></div>
</template><script lang="ts" setup name="Person">
import { ref } from 'vue'// 数据
let car = ref({ brand: '奔驰', price: 100 })
let games = ref([{ id: 'ahsgdyfa01', name: '英雄联盟' },{ id: 'ahsgdyfa02', name: '王者荣耀' },{ id: 'ahsgdyfa03', name: '原神' }
])
let obj = ref({a:{b:{c:{d:666}}}
})console.log(car)function changeCarPrice() {car.value.price += 10
}
function changeFirstGame() {games.value[0].name = '流星蝴蝶剑'
}
function test(){obj.value.a.b.c.d = 999
}
</script>

对比:

  1. ref用来定义:基本类型数据对象类型数据

  2. reactive用来定义:对象类型数据

  3. ref创建的变量必须使用.value

  4. reactive重新分配一个新对象,会失去响应式

toRef 和 toRefs

toRef解析响应式

将一个响应式对象中的每一个属性,转换为ref对象,toRefstoRef功能一致,但toRefs可以批量转换。

<template><div class="person"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><h2>性别:{{person.gender}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="changeGender">修改性别</button></div>
</template><script lang="ts" setup name="Person">import {ref,reactive,toRefs,toRef} from 'vue'// 数据let person = reactive({name:'张三', age:18, gender:'男'})// 通过toRefs将person对象中的n个属性批量取出,且依然保持响应式的能力let {name,gender} =  toRefs(person)// 通过toRef将person对象中的gender属性取出,且依然保持响应式的能力let age = toRef(person,'age')// 方法function changeName(){name.value += '~'}function changeAge(){age.value += 1}function changeGender(){gender.value = '女'}
</script>

computed计算函数

下面通过计算函数演示2个值相加,需要通过 import {computed} from "vue"; 引入函数

 

<template><div class="person">姓:<input type="text" v-model="firstName"> <br>名:<input type="text" v-model="lastName"> <br>全名:<span>{{fullName}}</span> <br><button @click="changeFullName">全名改为:li-si</button></div>
</template><script setup lang="ts" name="App">import {ref,computed} from 'vue'let firstName = ref('zhang')let lastName = ref('san')// 计算属性——只读取,不修改/* let fullName = computed(()=>{return firstName.value + '-' + lastName.value}) */// 计算属性——既读取又修改let fullName = computed({// 读取get(){return firstName.value + '-' + lastName.value},// 修改set(val){console.log('有人修改了fullName',val)firstName.value = val.split('-')[0]lastName.value = val.split('-')[1]}})function changeFullName(){fullName.value = 'li-si'} 
</script>

watch监听器

watch的作用是用来监听某个值的变化从而出发watch回调。watch可以:

  • 监听单体数据

  • 监听对象

  • 监听对象的某个属性

  • 监听多个数据

 

<template><div class="watch"></div><button @click="value++">修改value</button><button @click="persion.age++">修改persion</button>
</template>
<script setup>import {reactive, ref, watch} from "vue";const value = ref(1111);
const persion = reactive({username:"zs" ,age:18
})
//监听单个值
watch(value,()=>{console.log(value);
})
//监听对象
watch(persion,()=>{console.log(persion);
})//监听多个,用[]包含多个
watch([persion,value],()=>{console.log(persion,value);
});//监听对象的属性watch(()=>persion.age,()=>{console.log(persion);
}); </script>

watchEffect监听副作用

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行该函数。watchEffect的作用是只要使用到的数据都会被监听到,无需指定具体监听谁,他包含4个功能

  • 页面加载,watchEffect的回调就会立即执行

  • 只要watchEffect 只要里面使用了任何数据,就会触发回到函数

  • onCleanup函数可以清除副作用

  • 返回一个stopHandler可以停止监听

 

<template><div class="watch_effect"></div><button @click="num++">num++</button><button @click="stopHandler">StopWatch</button>
</template><script setup>import {ref, watchEffect} from "vue";const num = ref(1111);//1.页面加载,初始化立即回执行回调
//2.只要watchEffect 只要里面使用了数据,就会触发回到函数
//3.onCleanup函数可以清除副作用
//4.返回一个stopHandler可以停止监听
/**
watchEffect(()=>{console.log(num.value);
})**/const stopHandler = watchEffect(onCleanup=>{console.log(num.value);onCleanup(()=>{console.log("清除副作用");});
})</script>

生命周期方法

因为 setup 是围绕 beforeCreatecreated 生命周期钩子运行的,所以不需要显式地定义它们。换句话说,在这些钩子中编写的任何代码都应该直接在 setup 函数中编写。下表包含如何在 setup () 内部调用生命周期钩子:

选项式 API(VUE2)Hook inside setup
beforeCreateNot needed*    不需要
createdNot needed*    不需要
beforeMountonBeforeMount
挂载之前
mountedonMounted
页面加载完成时执行
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted
页面销毁时执行
errorCapturedonErrorCaptured
renderTrackedonRenderTracked
renderTriggeredonRenderTriggered
activatedonActivated
deactivatedonDeactivated

父子组件

父传参数给子

第一步:创建一个父组件页面,引入子组件,并传入参数 parent.vue

<template><H1 class="parent_child">父传子</H1><h2>使用子组件传参</h2><child-vue text="传入静态文本"  :num="num" :title="title" :persion="persion"></child-vue>
</template><script setup>//引入子组件取名用驼峰,页面用中划线 <child-vue></child-vue>
import ChildVue from "@/views/parent_child/child.vue";
import {reactive, ref} from "vue";//构建一个响应式对象
const persion = reactive({username:"zs",age:18
})
//定义响应式变量
const title = ref("我是标题");
const num = ref(111);
</script>

 第二步:创建一个子组件页面 : child.vue , 通过 defineProps接受父传入的参数

<template><h2>text:{{text}}</h2><h2>num:{{num}}</h2><h2>title:{{title}}</h2><h2>persion:{{persion}}</h2>
</template><script setup>
//通过defineProps来接受父传入过来的参数
const  prop = defineProps({text:String,num:Number,title:String,persion:Object
})
//在js中可以读取父传入过来的参数,但是不能修改
console.log("prop.title" , prop.title)</script>

子传参给父

子组件给父组件传值,需要通过defineEmits在子组件声明事件方法,然后调用该事件方法传值,父组件需要监听该事件方法取值。第一步:在子组件中准备一个按钮,点击按钮就给父组件传值。然后给按钮绑定一个方法。

<h1>给父组件传参</h1>
<button @click="sendData2Parent">给父组件传参</button>------------------------------------------------------------------------------------------//声明事件
const $emits = defineEmits(["data2parent","事件名","事件名"]);const  sendData2Parent = ()=>{//调用声明的事件$emits('data2parent',"传给父组件的数据");
}
  • const $emits = defineEmits(["data2parent","事件2","事件3"]); 自定义了三个事件

  • $emits('data2parent',"传给父组件的数据"); 调用自定义的事件

第二步:在父组件中绑定该事件,并调用一个函数来接受值

<child-vue @data2parent="getDataFromChild"  ...></child-vue>const getDataFromChild = (data)=>{console.log("打印数据",data);
}

子暴露

VUE3提供了 defineExpose 来暴露子组件中的数据和方法在父组件中可以拿到子组件中暴露的数据或者方法。第一步在子组件中暴露数据

//子暴露
defineExpose({data:"我是子暴露的数据",sayHi:()=>{return "我是子暴露的方法被调用返回的结果";}
})

第二步:在父组件接受子暴露的数据

<child-vueref="childVueRef" ...></child-vue>//用一个响应式变量,接受子暴露的数据
const childVueRef = ref(null);
onMounted(()=>{console.log("子暴露的数据:",childVueRef.value.data);console.log("子暴露的方法:",childVueRef.value.sayHi());
})
  • ref="childVueRef" : 接受子暴露,把数据绑定给childVueRef

注意:因为在父组件的 setup 函数中,声明周期很早,此时子组件还没加载,所以需要在onMounted去调用子暴露的数据和方法才可以拿到结果。

写在最后:Vue3是当前前端的主流框架,本篇介绍了一些vue3的基础核心语法,希望能够给大家带来帮助。笔者小,中,大厂均有面试经历,坚持每日分享java全栈开发知识,希望能够和大家共同进步。

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

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

相关文章

关于ant design vue 使用Modal无法关闭弹窗的解决思路

文章目录 1: 出现问题的版本2.出现问题&#xff08;1&#xff09;ant design 的问题&#xff08;2&#xff09;poina的提示报错 3.正确版本总结 1: 出现问题的版本 "ant-design-vue": "^3.2.20", "pinia": "^2.1.7", "vue"…

人工智能工具在软件开发中的作用与未来展望

随着生成式人工智能&#xff08;AIGC&#xff09;的迅猛发展&#xff0c;软件开发领域正经历着深刻的变革。从代码生成、错误检测到自动化测试&#xff0c;AI工具正在逐渐成为开发者的重要助手。然而&#xff0c;这也引发了对开发者职业前景和技能需求变化的广泛讨论&#xff1…

好看的风景视频素材在哪下载啊?下载风景视频素材网站分享

随着短视频和自媒体的兴起&#xff0c;美丽的风景视频不仅能让人眼前一亮&#xff0c;更能吸引大量观众。无论是旅游博主分享那些令人心旷神怡的旅行片段&#xff0c;还是视频编辑师寻找背景素材来增强作品的视觉效果&#xff0c;高质量的风景视频素材需求量巨大。以下是几个下…

Radio专业术语笔记

在收音机的 RDS (Radio Data System) 功能中&#xff0c;CT 代表 “Clock Time”。RDS 是一种数字广播标准&#xff0c;用于在调频广播中传输辅助数据&#xff0c;如电台名称、节目类型、交通信息等。CT 功能是其中的一部分&#xff0c;用于同步和显示广播电台发送的当前时间。…

【干货】SaaS企业使用PLG模式实现用户自增长与留存的三大战略

近年来越来越多toB厂商开始采用SaaS模式&#xff0c;消费者的体验需求和购买行为也逐渐转变。根据Forrester研究调查显示&#xff0c;B端购买者现在越来越倾向于进行产品体验和产品调研与评估&#xff0c;而非如传统的方式那样直接与销售人员接触。 因此&#xff0c;SaaS&…

.npy格式图像如何进行深度学习模型训练处理,亲测可行

import torchimport torch.nn as nnimport torch.nn.functional as Fimport numpy as npfrom torch.utils.data import DataLoader, Datasetfrom torchvision import transformsfrom PIL import Imageimport json# 加载训练集和测试集数据train_images np.load(../dataset/tra…

x86芯片定制,Ethercat芯片定制,适用于运动控制,工业总线等软硬一体机

x86芯片定制&#xff0c;Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验&#xff0c;对接您的产品规格场景需求&#xff0c;快速交付样机&#xff0c;包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

鸿蒙开发设备管理:【@ohos.settings (设置数据项名称)】

设置数据项名称 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块提供设置数据项的访问功能相关接口的说明及示例。 导入模块 import settings from ohos.settings;settings.getUri…

访问者模式在金融业务中的应用及其框架实现

引言 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你在不改变对象结构的前提下定义作用于这些对象的新操作。通过使用访问者模式&#xff0c;可以将相关操作分离到访问者中&#xff0c;从而提高系统的灵活性和可维护性。在金融业务…

数组理论基础

1. **数组定义**&#xff1a; - 数组是存放在连续内存空间上的相同类型数据的集合。 2. **数组特性**&#xff1a; - 数组下标从0开始。 - 数组的内存空间地址是连续的。 3. **数组操作**&#xff1a; - 数组可以通过下标索引快速访问元素。 - 数组元素的删除…

修复 OpenSSH 爆出极其严重的安全漏洞!

最近几天OpenSSH爆出了一个高危漏洞&#xff1a;CVE-2024-6387&#xff0c;影响到了很多的Linux服务器系统。明月第一时间给所有的代维客户服务器进行了排查和漏洞修复&#xff0c;因此耽搁了一些时间。直到今天才算抽出空来给大家分享一下。严格上来说这个漏洞的危险性还是极高…

PR视频剪辑(2)——节奏把控(导入、序列、素材出入点、标记点)

PR视频剪辑(2)——视频节奏(导入、项目窗口、序列、素材出入点、标记点) 一、新建项目、导入素材1.1 拖动导入1.2 双击导入1.3 右键导入1.4 窗口导入1.5 选择文件导入1.6 快捷键导入(ctrl + i)1.7 文件夹导入(文件夹全是素材就可使用该方法)二、项目窗口(介绍项目窗口…

等保2.0 实施方案之信息软件验证要求

一、等保2.0背景及意义 随着信息技术的快速发展和网络安全威胁的不断演变&#xff0c;网络安全已成为国家安全、社会稳定和经济发展的重要保障。等保2.0&#xff08;即《信息安全技术 网络安全等级保护基本要求》2.0版本&#xff09;作为网络安全等级保护制度的最新标准&#x…

CesiumJS【Basic】- #058 绘制网格填充多边形(Entity方式)-使用shader

文章目录 绘制网格填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制网格填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制网格填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 实例…

非NVIDIA联盟——如UALink(超加速器链接)联盟和UXL基金会等组织发起反击

随着NVIDIA可能面临法国反垄断监管机构的指控&#xff0c;非NVIDIA联盟——如UALink&#xff08;超加速器链接&#xff09;联盟和UXL基金会等组织——正据报道发起反击&#xff0c;大幅增加在专用ASIC开发上的努力。 据《工商时报》报道&#xff0c;相关的半导体知识产权&…

在鸿蒙ArkTS中使用Three.js实现3D模型渲染

1.引言 鸿蒙操作系统作为华为自主研发的分布式操作系统,正在迅速发展并获得越来越多开发者的关注。ArkTS作为鸿蒙原生开发语言,提供了强大的声明式UI框架和丰富的系统能力。然而,在复杂的3D图形渲染方面,ArkTS还缺乏原生的支持。 Three.js是一个流行的JavaScript 3D库,它简化…

Qt窗口阴影效果

qt中&#xff0c;一些弹窗我们期望有一个阴影的效果。我们可以在ui界面中&#xff0c;对整个窗口的边缘预留10px&#xff0c;然后在构造函数中设置一下的代码&#xff0c;当然还要设置透明属性&#xff0c;然后即可实现。 // 创建阴影效果QGraphicsDropShadowEffect *shadowEf…

Linux 【线程池】【单例模式】【读者写者问题】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 &#x1f3f3;️‍&#x1f308;前言 …

ES6自定义模块

在ES6中&#xff0c;我们可以使用 export 和 import 关键字来定义和使用自定义模块。 定义模块 导出&#xff08;export&#xff09; 命名导出&#xff08;Named Exports&#xff09;&#xff1a; 使用 export 关键字来导出模块中的变量、函数、类等。例如&#xff1a; // ma…