位置: 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进程查询

  • apple watch如何开启手表来电时的声音和振动(apple watch如何开启省电)

    apple watch如何开启手表来电时的声音和振动(apple watch如何开启省电)

  • ps4手柄如何连接win10蓝牙(ps4手柄如何连接ps4)

    ps4手柄如何连接win10蓝牙(ps4手柄如何连接ps4)

  • 抖音看不了评论是什么原因(抖音看不了评论是什么原因怎么回事)

    抖音看不了评论是什么原因(抖音看不了评论是什么原因怎么回事)

  • 抖音点亮是什么意思(抖音 亮点)

    抖音点亮是什么意思(抖音 亮点)

  • ns精灵球充电不亮灯(ns精灵球电量)

    ns精灵球充电不亮灯(ns精灵球电量)

  • oppo reno4和reno3的区别(oppo reno4和reno3哪个性价比高)

    oppo reno4和reno3的区别(oppo reno4和reno3哪个性价比高)

  • 电脑显示屏变粉色了怎么办(电脑显示器突然变粉)

    电脑显示屏变粉色了怎么办(电脑显示器突然变粉)

  • 苹果可以换字体吗(苹果手机怎么换字体)

    苹果可以换字体吗(苹果手机怎么换字体)

  • qq连麦微信会忙线吗(qq连麦的时候微信打得进来吗)

    qq连麦微信会忙线吗(qq连麦的时候微信打得进来吗)

  • 电脑没有网线怎么上网(电脑没有网线怎么连接网络)

    电脑没有网线怎么上网(电脑没有网线怎么连接网络)

  • 微信聊天语音转发播放不了(微信聊天语音转文字怎么操作)

    微信聊天语音转发播放不了(微信聊天语音转文字怎么操作)

  • 商品链接怎么复制(商品链接怎么复制进电子表格)

    商品链接怎么复制(商品链接怎么复制进电子表格)

  • 爱奇艺清晰度怎么调(爱奇艺清晰度怎么每次都要调)

    爱奇艺清晰度怎么调(爱奇艺清晰度怎么每次都要调)

  • 显示3g在线的几种可能(3g是在线还是不在线)

    显示3g在线的几种可能(3g是在线还是不在线)

  • p30指纹识别不灵敏怎么办(p30指纹识别不灵怎么回事)

    p30指纹识别不灵敏怎么办(p30指纹识别不灵怎么回事)

  • 无线网卡驱动在哪个文件夹(无线网卡驱动在哪更新)

    无线网卡驱动在哪个文件夹(无线网卡驱动在哪更新)

  • vivo手机数据怎么转换(vivo手机数据怎么恢复)

    vivo手机数据怎么转换(vivo手机数据怎么恢复)

  • sancup这是什么手机(sancup是什么手机)

    sancup这是什么手机(sancup是什么手机)

  • 小米6x怎么开微信美颜(小米6怎么设置微信)

    小米6x怎么开微信美颜(小米6怎么设置微信)

  • 微信头像换不了是什么原因(微信头像换不了,说由于系统维护换不了怎么办)

    微信头像换不了是什么原因(微信头像换不了,说由于系统维护换不了怎么办)

  • 手机型号在哪里看(手机型号在哪里看 vivo)

    手机型号在哪里看(手机型号在哪里看 vivo)

  • 移动硬盘通过Mac磁盘工具抹掉磁盘不小心强制退出急救方法(移动硬盘通过软件改硬盘容量怎么改)

    移动硬盘通过Mac磁盘工具抹掉磁盘不小心强制退出急救方法(移动硬盘通过软件改硬盘容量怎么改)

  • Vue创建项目的详细步骤(vue3.0项目创建)

    Vue创建项目的详细步骤(vue3.0项目创建)

  • 图解Nginx,系统架构演变 + Nginx反向代理与负载均衡(nginx gui)

    图解Nginx,系统架构演变 + Nginx反向代理与负载均衡(nginx gui)

  • 税盾是怎么产生的
  • 工商年报多久能显示
  • 餐饮服务需要缴纳增值税吗
  • 注册公司认缴出资方式怎么选
  • 旅游企业纳税
  • 非营利机构注册要求
  • 制造业三项费用占比行业怎么算
  • 转登记小规模纳税人转让固定资产
  • 外购货物准予抵扣进项税额26万元,货物已验收入库
  • 汇兑损益需要缴税吗
  • 债务清偿抵充的案例
  • 应付账款不用付怎么处理
  • 往年预付账款错了,应如何调?
  • 应付职工薪酬账务处理例题
  • 应付账款扣除商业折扣
  • 工程施工购买的标示牌怎么开票给甲方
  • 住宿费可以开会议费吗
  • 员工销售家具取得的工资怎么写分录?
  • 认缴制下实收资本印花税
  • 购买物品的专用会计科目
  • 2016年红冲发票流程
  • 多缴税款能否跨年抵扣
  • 补交之前年度税款怎么调账
  • 企业的不征税收入用于支出所形成的资产
  • 分期开发是什么意思
  • 普通发票没有进账怎么办
  • 现金流量表的编制依据
  • 房屋对外投资
  • 停薪留职标准
  • php创建表单
  • win11怎么清理内存
  • Qq浏览器里的文档怎么以文件形式发送
  • onekey.exe是什么
  • 说一下键盘
  • PHP:pg_connection_busy()的用法_PostgreSQL函数
  • 进程查看工具
  • PHP:imagepsextendfont()的用法_GD库图像处理函数
  • 发放职工薪酬的账务处理
  • thinkphp saveall
  • Stable Diffusion 关键词tag语法教程
  • 普票3个点可以抵扣吗
  • ibm_db_dbi
  • 收集整理数据
  • 织梦相关文章调用
  • 母公司无偿借款给子公司
  • 权益法的股权比例
  • 城镇土地使用税怎么算
  • 简易征收 简易计税
  • 应收账款周转率高说明
  • 工程建设项目融资方式有哪些
  • 招待费如何做账科目
  • 公司加班的餐费怎么算
  • 外购商品为什么是库存商品
  • 关于园林绿化经济的论文
  • 设置mysql数据库字符集的语句
  • sql2005和2000区别
  • mysql解压版怎么使用
  • win10一年更新一次
  • 去掉电脑右下角显示的时间
  • ubuntu linux指南:基础篇
  • centos state down
  • linux updatedb
  • win7系统搜索不到自己家wi-fi
  • windows7一键还原在哪
  • win10专业版怎么调屏幕亮度
  • ssh encountered 1 errors during the transfer错误3种解决方法
  • jquery prompt
  • bootstrap treeview 扩展addNode方法动态添加子节点的方法
  • perl数组去重
  • c调用nodejs
  • 简单谈谈你对公安工作的认识
  • 以下代码的运行结果是哪一项
  • javascript基础教程pdf
  • android手机屏幕采集触摸区域所有点
  • 使用jquery实现的项目
  • 如何查询税务情况
  • 国税总局云南省税务局官网
  • 财税专家刘杨简历
  • 社保扣费为什么忽高忽低
  • 鸿蒙2.0哪个版本续航好
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设