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

  • 苹果13pro怎么插卡(苹果14promax怎么插两张卡)

    苹果13pro怎么插卡(苹果14promax怎么插两张卡)

  • 华为nova2s支持鸿蒙系统吗(华为nova2s支持红外功能吗)

    华为nova2s支持鸿蒙系统吗(华为nova2s支持红外功能吗)

  • 华硕飞行堡垒键盘灯怎么开(华硕飞行堡垒键盘灯光怎么关闭)

    华硕飞行堡垒键盘灯怎么开(华硕飞行堡垒键盘灯光怎么关闭)

  • word怎么创建新样式(word怎么创建新的一页)

    word怎么创建新样式(word怎么创建新的一页)

  • 华为nova9多少钱(华为nova9多少钱8+128)

    华为nova9多少钱(华为nova9多少钱8+128)

  • 淘宝怎么投诉卖家(淘宝怎么投诉卖家质量问题不给退货)

    淘宝怎么投诉卖家(淘宝怎么投诉卖家质量问题不给退货)

  • p40支持红外线吗(华为p40是否支持红外线)

    p40支持红外线吗(华为p40是否支持红外线)

  • 闲鱼网自提什么时候收钱(闲鱼自提是当面给钱吗)

    闲鱼网自提什么时候收钱(闲鱼自提是当面给钱吗)

  • 小米截图分辨率设置(小米截图大小设置)

    小米截图分辨率设置(小米截图大小设置)

  • qq备注是什么意思(qq中的备注是什么意思)

    qq备注是什么意思(qq中的备注是什么意思)

  • 电脑软件一般存哪个盘(电脑软件一般存多少G)

    电脑软件一般存哪个盘(电脑软件一般存多少G)

  • 淘宝属于什么行业(淘宝属于什么行运营在校经历业)

    淘宝属于什么行业(淘宝属于什么行运营在校经历业)

  • x23强制重启(x23强制重启方法)

    x23强制重启(x23强制重启方法)

  • 红米note7progps信号弱怎样解决(红米note7gps设置在哪里)

    红米note7progps信号弱怎样解决(红米note7gps设置在哪里)

  • 主叫号码未显示是什么意思(主叫号码未显示接了有危险吗)

    主叫号码未显示是什么意思(主叫号码未显示接了有危险吗)

  • 华为nova3和3i的区别(华为nova3和3i的区别外观)

    华为nova3和3i的区别(华为nova3和3i的区别外观)

  • 荣耀9x升降寿命(荣耀x9是升降摄像头吗)

    荣耀9x升降寿命(荣耀x9是升降摄像头吗)

  • 已经下单了怎么备注(已经下单了怎么改收货地址)

    已经下单了怎么备注(已经下单了怎么改收货地址)

  • 逗拍视频怎么上传抖音(在逗拍上面怎么做视频)

    逗拍视频怎么上传抖音(在逗拍上面怎么做视频)

  • 小米8青春版运行内存是多少(小米8青春版运行内存扩展)

    小米8青春版运行内存是多少(小米8青春版运行内存扩展)

  • 校友邦如何虛拟定位(校友邦虚拟定的app)

    校友邦如何虛拟定位(校友邦虚拟定的app)

  • 华为duallens是什么型号手机(华为duallensasph是什么型号手机)

    华为duallens是什么型号手机(华为duallensasph是什么型号手机)

  • iPhone Xs Max手机外形是那种(iphonexsmax手机屏幕失灵怎么办)

    iPhone Xs Max手机外形是那种(iphonexsmax手机屏幕失灵怎么办)

  • 共享停车位app怎么开发(共享停车位app哪个好)

    共享停车位app怎么开发(共享停车位app哪个好)

  • 手机插上充电器一直跳(手机插上充电器后不停的充电和断电)

    手机插上充电器一直跳(手机插上充电器后不停的充电和断电)

  • c语言中typedef关键字是什么(c语言中的typedef struct)

    c语言中typedef关键字是什么(c语言中的typedef struct)

  • 进项税额转出补交税款
  • 房地产开发公司组织架构
  • 移动怎么开当月发票
  • 个人所得税累计扣除标准
  • 签劳务合同需要什么资质
  • 城建税有没减半
  • 可供出售金融资产计入什么科目
  • 出售本月转入处置的固定资产应交税费
  • 交易性金融资产借贷方向
  • 公司化验室领用丙材料3000元
  • 进项发票认证后暂不抵扣
  • 赞助支出为什么不算广告费
  • 购买商品有运费的分录
  • 付款单中未全付款怎么办
  • 承包外单位食堂会计怎么做账
  • 一般纳税人出租不动产增值税税率
  • 工程公司安装中央空调能按混合销售计算增值税么?
  • 接受实物投资的增值税会计核算方法
  • 税款负担方式是什么
  • 鉴证咨询公司成本是什么
  • 坏账处理的所得税税率
  • 一般纳税人购车可以抵扣多少税
  • 股东利润分配预缴税款
  • 小规模纳税人每季度超过30万交税
  • 增值税发票附表
  • 代缴社保工资怎么做账
  • 代收代付差额征税
  • 个体工商户开9%的税需要什么
  • 未开票的货款记什么科目
  • 研发支出是否可以抵税
  • 分期购车的会计分录
  • 如何结转销售收入
  • 个人所得税投诉电话是多少
  • 交际应酬费可以抵扣吗
  • 工业企业汽车发生费用处理
  • 企业研发费用可以只加计一半吗
  • 更改公司章程发函怎么写
  • php技巧
  • electronx
  • 公司设备搬家费会计分录
  • 哪些研发费用可以资本化
  • 应收代垫款
  • 建筑行业销售材料怎么做
  • 资产负债表和利润表的勾稽关系
  • 个人所得税两处或两处以上工资、薪金所得纳税申报表
  • 允许从销项税额中扣除的有
  • 公司个人借款如何下账
  • php mysql教程
  • 外购无形资产的增值税计入成本吗
  • 股权转让完税证明图片
  • 借款利息应计入
  • 公司赞助学校
  • 坏账准备与应收账款的影响有哪些
  • 建筑行业项目经理的岗位职责
  • 对公账户 发票
  • 资本金账户资金允许
  • mysql服务自动停止运行
  • 出现错误,请联系客服
  • windows2003密码破解
  • 卷影复制是什么
  • ubuntu安装chia
  • win8切换管理员账户
  • linux nc命令详解
  • mac安装dw
  • win8怎么设置成win7菜单
  • win7系统在那个文件夹
  • win7系统c盘占用空间大
  • jquery左滑切换
  • nodejs 代码加密
  • 关于shell的说法,不正确的是
  • bootstrap tooltip
  • Vuforia 4.0 beta——Object Recognition (一)
  • javascript:void(0)的作用示例介绍
  • jquery遍历li
  • 天气球球怎么下载
  • jquery 右键菜单
  • Javascript 字符串拼接
  • python获取数据代码
  • Javascript字符串对象函数
  • 车辆购置税完税证明有用吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设