位置: IT常识 - 正文

Vue3+TS教程(vue3+ts写法)

编辑:rootadmin
Vue3+TS教程 Vue3组合式API1.钩子函数steup函数的普通用法<script>export default { setup() { return {} }}</script><template></template>简写使用setup<script setup></script><template></template>2.响应式APIref函数<script setup>import { ref } from 'vue'const state = ref(0)function increment() { state.value++}</script><template> <button @click="increment"> {{ state }} </button></template>reactive函数<script setup>import { reactive } from 'vue'const state = reactive({ count: 0 })function increment() { state.count++}</script><template> <button @click="increment"> {{ state.count }} </button></template>3.计算属性API单向响应<script setup>import { computed,reactive } from 'vue'const Person=reactive({X:'张',M:'三'}) Person.XM=computed(()=>{ return Person.X+'-'+Person.M })</script><template> 姓:<input v-model="Person.X"><br> 名:<input v-model="Person.M"><br> 单向响应:<input v-model="Person.XM"></template>双向响应<script setup>import { computed,reactive } from 'vue'const Person=reactive({X:'张',M:'三'})Person.AXM=computed({ get(){ return Person.X+'-'+Person.M }, set(value){ const arr=value.split('-') Person.X=arr[0] Person.M=arr[1] }})</script><template> 姓:<input v-model="Person.X"><br> 名:<input v-model="Person.M"><br> 双向响应:<input v-model="Person.AXM"></template>4.监听属性API监听整个对象<!-- // 监听整个对象,由于是浅拷贝,他们新旧指向的是通一个对象 --><script setup>import {reactive,watch} from 'vue'const Person=reactive({name:'张三',age:18, job:{salary:20}}) watch(Person,(newVal,oldVal)=>{ console.log('用户信息发生了变化',newVal,oldVal); })</script><template> <h2>年龄:{{Person.age}}</h2> <button @click="Person.age++">+1</button></template>监听对象中单个属性<!-- 监听对象中单个属性,监听单个属性可以检测到新旧值 --><script setup>import {reactive,watch} from 'vue'const Person=reactive({name:'张三',age:18, job:{salary:20}}) watch(()=>Person.age,(newVal,oldVal)=>{ console.log('用户年龄发生了变化',newVal,oldVal); })</script><template> <h2>年龄:{{Person.age}}</h2> <button @click="Person.age++">+1</button></template>监听多个对象<!-- 监听对象中多个个属性,监听单个属性可以检测到新旧值 --><script setup>import {reactive,watch} from 'vue'const Person=reactive({name:'张三',age:18, job:{salary:20}}) watch([()=>Person.name,()=>Person.age],(newValue,oldValue)=>{ console.log('person.name或者person.age的值变化了',newValue,oldValue); })</script><template> <h2>姓名:{{Person.name}}</h2> <button @click="Person.name+='~'">修改</button> <h2>年龄:{{Person.age}}</h2> <button @click="Person.age++">+1</button></template>监听对象中对象(深度监听)<!-- 监听对象中对象,必须开启深度监听,一般情况不监听对象 --><script setup>import {reactive,watch} from 'vue'const Person=reactive({name:'张三',age:18, job:{salary:20}}) watch(()=>Person.job,(newValue,oldValue)=>{ console.log('person.job的值变化了',newValue,oldValue); },{ deep:true })</script><template> <h2>薪资:{{Person.job.salary}}K</h2> <button @click="Person.job.salary++">+1</button></template>5.高级监听API基本使用(默认执行一次)<!-- watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。 --><script setup>import {reactive,watchEffect} from 'vue'const Person=reactive({ name:'张三' }) watchEffect(()=>{ Person.name console.log('姓名发送了变化'); })</script><template> <h2>姓名:{{Person.name}}</h2> <button @click="Person.name+='~'">修改</button></template>监听御前处理oninvalidate参数<script setup lang="ts">import { reactive, watchEffect } from "vue";const Person = reactive({ name: "张三",});watchEffect((oninvalidate) => { oninvalidate(() => { console.log("before"); }); Person.name; console.log("姓名发送了变化");});</script><template> <h2>姓名:{{ Person.name }}</h2> <button @click="Person.name += '~'">修改</button></template>停止监听<script setup lang="ts">import { reactive, watchEffect } from "vue";const Person = reactive({ name: "张三",});const stop = watchEffect((oninvalidate) => { oninvalidate(() => { console.log("before"); }); Person.name; console.log("姓名发送了变化");</script><template> <h2>姓名:{{ Person.name }}</h2> <button @click="Person.name += '~'">修改</button> <button @click="stop">停止</button></template>6.响应式对象解构APItoRef函数<script setup>import {reactive,toRef} from 'vue'const person=reactive({A:1,B:2})const A=toRef(person,'A')</script><template> <h2>姓名:{{A}}</h2> <button @click="person.A+='~'">修改</button></template>toRefs<script setup lang="ts"> import {reactive,toRefs} from 'vue' const person=reactive({A:1,B:2}) const {A,B}=toRefs(person) </script> <template> <h2>姓名:{{A}}</h2> <button @click="A+=1">修改</button> </template>7.生命周期API<script setup> import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,ref} from "vue"; onBeforeMount(()=>{ console.log('---挂载之前---'); }) onMounted(()=>{ console.log('---挂载---'); }) onBeforeUpdate(()=>{ console.log('---更新之前---'); }) onUpdated(()=>{ console.log('---更新---'); }) onBeforeUnmount(()=>{ console.log('---卸载之前---'); }) onUnmounted(()=>{ console.log('---卸载---'); })</script>8.ref获取dom<template> <div> <div ref="box">我是div</div> </div></template><script>import { ref,onMounted } from "vue";export default { setup() { let box = ref(null); //本质是reactive({value:null}) // 需要在生命周期获取 onMounted(()=>{ // 当界面挂载出来后就会自动执行 console.log(box.value); }) //接受的是null,原因是setup执行时机比mounted早,dom还没形成 console.log(box.value); return { box }; },};</script>9.Hooks(1)官方hooksuseAttrs()<!-- 父组件 --><template> <Acom a="456" title="789" /></template><!-- 子组件 --><!-- 获取父组件传过来的全部参数 --><script setup lang="ts">import { useAttrs } from 'vue'let attr = useAttrs()console.log(attr)</script>(2)自定hooks自定义hooks转换图片import { onMounted } from 'vue'type Options = { el: string}export default function (options: Options): Promise<{ baseUrl: string }> { return new Promise(resolve => { onMounted(() => { const img: HTMLImageElement = document.querySelector( options.el ) as HTMLImageElement img.onload = () => { resolve({ baseUrl: base64(img) }) } }) const base64 = (el: HTMLImageElement) => { const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') canvas.width = el.width canvas.height = el.height ctx?.drawImage(el, 0, 0, canvas.width, canvas.height) return canvas.toDataURL('image/jpg') } })}使用hooks<script setup lang="ts">import BASE64 from './hooks'BASE64({ el: '#img' }).then(resolve => { console.log(resolve.baseUrl)})</script>(3)第三方hooks安装依赖yarn add @vueuse/core简单使用<script setup lang="ts">import { ref } from 'vue'import { useDraggable } from '@vueuse/core'const el = ref<HTMLElement | null>(null)// `style` will be a helper computed for `left: ?px; top: ?px;`const { x, y, style } = useDraggable(el, { initialValue: { x: 40, y: 40 }})</script><template> <div ref="el" :style="style" style="position: fixed"> Drag me! I am at {{ x }}, {{ y }} </div></template>组件间通讯1.props父传子父组件<script setup >import HelloWorld from './components/HelloWorld.vue'</script><template> <HelloWorld msg="1"/></template>子组件<script setup>// const props=defineProps(['msg'])const props=defineProps({msg:String})console.log(props.msg)</script>2.emit子传父父组件<script setup >import HelloWorld from './components/HelloWorld.vue'const getuser=(a)=>{ console.log(a)}</script><template> <HelloWorld @getuser="getuser"/></template>子组件<script setup lang="ts">const emit = defineEmits(['getuser'])function buttonClick() { emit('getuser',1)} </script><template> <button @click="buttonClick">传输</button></template>自定义事件事件校检<script setup>const emit = defineEmits({ // 没有校验 click: null, // 校验 submit 事件 submit: ({ email, password }) => { if (email && password) { return true } else { console.warn('Invalid submit event payload!') return false } }})function submitForm(email, password) { emit('submit', { email, password })}</script>3.插槽通讯(1)匿名插槽子组件<template> <!-- slot插槽占位 --> <slot></slot></template>父组件<script setup lang="ts">import HelloWorld from "./components/HelloWorld.vue";</script><template> <HelloWorld> 插槽传递 </HelloWorld></template>(2)具名插槽父组件<script setup lang="ts">import HelloWorld from "./components/HelloWorld.vue";</script><template> <HelloWorld> <!-- v-slot:简写# --> <template v-slot:btn> <button>具名插槽</button> </template> </HelloWorld></template>子组件<template> <!-- slot插槽占位 --> <slot name="btn"></slot></template>(3)作用域插槽理解:数据在子组件的自身,但根据数据生成的结构需要父组件决定。父组件<script setup lang="ts">import HelloWorld from "./components/HelloWorld.vue";const person=[{name:'小明',age:18},{name:'小红',age:20}]</script><template>// 父组件将信息传递给子组件<HelloWorld :person="person">// 子组件接收父组件的插槽中传的值 <template #tab="scope"><tr v-for="(item,index) in scope.person" :key="index"> <th>{{item.name}}</th> <th>{{item.age}}</th> <th><button >编辑</button></th></tr></template></HelloWorld></template>子组件<script setup lang="ts">const props=defineProps<{person:{name:string,age:number}[]}>()</script><template> <table border="1"> <tr> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> <!-- 作用域插槽命名 --> // 向作用插槽中传值 <slot name="tab" :person="props.person"></slot> </table></template>4.依赖注入父组件(祖先组件)<!-- 依赖注入传的参可以在子组件中改变 --><template> <div class="App"> <button>我是App</button> <A></A> </div></template><script setup lang="ts">import { provide, ref } from 'vue'import A from './components/Acom.vue'let flag = ref<number>(1)provide('flag', flag)</script>子组件(后代组件)<template> <div> 我是B <div>{{ flag }}</div> <button @click="flag++">+1</button> </div></template><script setup lang="ts">import { inject, ref } from 'vue'// 注入值,默认值(让其可以进行类型推断)const flag = inject('flag', ref(1))</script>5.兄弟传参(1)父组件当成一个桥梁(2)发布订阅模式Bus传递type BusClass = { emit: (name: string) => void on: (name: string, callback: Function) => void}type PramsKey = string | number | symboltype List = { [key: PramsKey]: Array<Function>}class Bus implements BusClass { list: List constructor() { this.list = {} } emit(name: string, ...args: Array<any>) { const evnentName: Array<Function> = this.list[name] evnentName.forEach(fn => { fn.apply(this, args) }) } on(name: string, callback: Function) { const fn: Array<Function> = this.list[name] || [] fn.push(callback) this.list[name] = fn }}export default new Bus()A组件传递数值<script setup lang="ts">import { ref } from 'vue'import Bus from '../utils/Bus'const flag = ref(1)const Pass = () => { Bus.emit('pass', flag)}</script><template> <div> 我是A <div>{{ flag }}</div> <button @click="Pass">Pass</button> </div></template><style scoped lang="less"></style>B组件接收数值<script setup lang="ts">import Bus from '../utils/Bus'import { ref, type Ref } from 'vue'const flag = ref(0)Bus.on('pass', (Flag: Ref<number>) => { console.log(Flag) flag.value = Flag.value})</script><template> <div> 我是B <div>{{ flag }}</div> <button @click="flag++">+</button> </div></template><style scoped lang="less"></style>(3)第三方库mitt安装yarn add mitt全局挂载mitimport { createApp } from 'vue'import { createPinia } from 'pinia'import App from './App.vue'import './assets/main.css'import mitt from 'mitt'const Mit = mitt()const app = createApp(App)// 类型
本文链接地址:https://www.jiuchutong.com/zhishi/283491.html 转载请保留说明!

上一篇:黑枣的功效与作用(黑枣的功效与作用图片)

下一篇:PQIMountSvc.exe是什么进程 PQIMountSvc进程查询

  • 快手怎么单独不让一个人看(快手怎么单独不让一个人看我的视频)

    快手怎么单独不让一个人看(快手怎么单独不让一个人看我的视频)

  • 钉钉红包收到的钱到哪里去了(钉钉红包收到的钱在哪)

    钉钉红包收到的钱到哪里去了(钉钉红包收到的钱在哪)

  • 华为手机下载的视频在哪里(华为手机下载的音乐在哪个文件夹)

    华为手机下载的视频在哪里(华为手机下载的音乐在哪个文件夹)

  • 抖音视频发微信怎么发不了完整视频(抖音视频发微信怎么发)

    抖音视频发微信怎么发不了完整视频(抖音视频发微信怎么发)

  • mocor是什么系统(macos mojave是什么)

    mocor是什么系统(macos mojave是什么)

  • 苹果xs黑屏一直转圈圈(苹果xs黑屏一直转圈)

    苹果xs黑屏一直转圈圈(苹果xs黑屏一直转圈)

  • 华为录屏怎么同时录自己的声音(华为手机怎样同屏录制)

    华为录屏怎么同时录自己的声音(华为手机怎样同屏录制)

  • 苹果笔记本充电器上的两个耳朵有什么用(苹果笔记本充电口在哪里)

    苹果笔记本充电器上的两个耳朵有什么用(苹果笔记本充电口在哪里)

  • 抖音里面的年龄计算器怎么玩(抖音里面的年龄怎么看)

    抖音里面的年龄计算器怎么玩(抖音里面的年龄怎么看)

  • word能编辑的文件类型有(word编辑的文档怎么保存到桌面)

    word能编辑的文件类型有(word编辑的文档怎么保存到桌面)

  • word2010分栏可以分几栏(word2010分栏可以上下分吗)

    word2010分栏可以分几栏(word2010分栏可以上下分吗)

  • 80英寸电视长宽是多少(80英寸电视长宽多少厘)

    80英寸电视长宽是多少(80英寸电视长宽多少厘)

  • 苹果手机拉黑了怎么解开(苹果手机拉黑了别人,别人发短信会显示什么)

    苹果手机拉黑了怎么解开(苹果手机拉黑了别人,别人发短信会显示什么)

  • 苹果手机返厂需要发票吗(苹果手机返厂需要什么)

    苹果手机返厂需要发票吗(苹果手机返厂需要什么)

  • 可用图片帮别人扫单车吗(照片能给别人吗)

    可用图片帮别人扫单车吗(照片能给别人吗)

  • vivo手机手电筒打开不亮(vivo手机手电筒在哪里设置)

    vivo手机手电筒打开不亮(vivo手机手电筒在哪里设置)

  • 布局选项卡中有哪些操作(布局选项卡中有哪些内容)

    布局选项卡中有哪些操作(布局选项卡中有哪些内容)

  • 新版word页面设置在哪(word 页面设置)

    新版word页面设置在哪(word 页面设置)

  • 华为tof3d镜头有什么用(mate30 tof镜头)

    华为tof3d镜头有什么用(mate30 tof镜头)

  • 关机会说无法接通吗(关机会说无法接收短信吗)

    关机会说无法接通吗(关机会说无法接收短信吗)

  • 相机lock是什么开关(相机lock是什么功能)

    相机lock是什么开关(相机lock是什么功能)

  • 苹果怎么无线充电(苹果怎么无线充电不了)

    苹果怎么无线充电(苹果怎么无线充电不了)

  • 拼多多怎么加入购物车一起付款(拼多多怎么加入多件)

    拼多多怎么加入购物车一起付款(拼多多怎么加入多件)

  • 增值税销项税额公式
  • 税后净营业利润英文
  • 发票低于实际支付的金额如何做账
  • 税控盘锁死日期查询
  • 营业外收入做销项税调整
  • 注销税务登记申请书
  • 实收资本收到后用途
  • 生产用电费
  • 工人受伤医药费计入什么科目
  • 车间停产期间设施有哪些
  • 公司购买饮水机的申请
  • 经济纠纷的解决途径包括哪些
  • 异地预缴企业所得税几个点
  • 免税销售额怎么算出来的
  • 一卡通充值计入什么费
  • 公司账上没钱还假发工资违法吗
  • 个人承包工程如何合理避税
  • 计提个人负担的社会保险费分录
  • 政府收购企业资产规定
  • 收到委托代销清单的会计分录
  • spf13-vim – Vim编辑器终极发布
  • 进入英雄联盟显示超频怎么办
  • 行政事业单位向企业借款违反了什么规定
  • 公司清理固定资产怎么开票
  • linux系统中安装软件的批处理文件
  • 增值税发票月末怎么账务处理
  • 盈余公积减少记哪方
  • 如何理解什么是社会制度
  • 在一个js文件中怎么写
  • 签了购房合同贷款办不下来怎么办
  • 律师异地办案家属要跟着吗
  • 开了专票就不能享受政策
  • 存放在仓库中的柴油属于什么会计要素
  • python中strftime用法
  • Fatal error: Call to undefined function mysqli_init() in 路径
  • 简述SQL server管理器的功能
  • 贴现模式怎么计算利息
  • 怎样根据税负率计算税额
  • 销售价格确定的方法有
  • 需要做审计有哪些行业
  • 加计扣除适用于什么企业
  • 增值税期末留抵退税原因采集确认单
  • 动漫产业增值税率是多少
  • 税费滞纳金计入营业外支出吗
  • 应付账款与实际付款有差异如何分录
  • 公司前期装修费属于开办费吗
  • 医院食堂餐饮服务方案
  • 普票丢失可以以照片入账么
  • 转账支票办理收款所要拿的单证
  • 公司注销帐务怎么处理
  • 先收发票后付款怎么做分录
  • 微信收款怎样记账
  • 技术咨询费属于什么类别
  • 企业对财会人员的要求
  • 财付通交易手续费多少
  • win8设置怎么打开
  • windows server 2008 r2开启远程访问
  • mac怎么传输文件夹
  • 为大家详细介绍英语
  • linuxftp服务器
  • linux rm 命令删除文件恢复
  • linux ssh key登录
  • node.js http服务器
  • android mark
  • ubuntu 20.4安装
  • import和export区别
  • shell 数组操作
  • 深入讲解MACD:MACD红绿柱
  • shell脚本获取文件指定内容
  • 三消游戏在线
  • js基础教程
  • adb shell命令
  • 电子税务局怎么添加银行账户信息
  • 高新技术企业认定
  • 工商注册和税务登记费用
  • 研发费用加计扣除是什么意思啊
  • 怎么屏蔽微信群消息,但是不退出此群
  • 法人实名采集必须去现场吗
  • 进项税发票过期了怎么办
  • 云南省代理记账管理实施办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设