浅谈Vue开发

自定义组件某个模块

- vue中可以采用slot即插槽的方式去植入我们自定义的模块

  • 默认插槽
父级:

<MyInput>
    <div>hello 大刷币</div>
</MyInput>



子级:

<div>
<slot></slot>
</div>
  • 具名插槽
父级:

<MyInput>
  <template #handsome>
    <div>hello 大刷币</div>
  </template>
</MyInput>



子级:

<div>
<slot name='handsome'></slot>
</div>
  • 作用域插槽
父级:

<MyInput>
  <template v-slot="{greet}">
    <div>{{greet}}</div>
  </template>
</MyInput>



子级:

<div>
<slot greet="hello 大帅比"></slot>
</div>

挂载到某个节点

<Teleport to="xx"></Teleport>

巧用$attrs

在props和emits显示声明的属性除外,多节点一定要指定不然会有警告~

<template>
<div>hello</div>
<div v-bind="$attrs">大帅比</div>
</template>

defineModel (Vue 3.4)

实现属性双向数据绑定

父组件:
const greet= ref('Hello 大帅比')

<MyInput v-model="greet"></MyInput>

子组件:
<template>
    <div>{{ name }}</div>
</template>
<script setup>
const name = defineModel()
</script>

defineProps/defineEmits

  • defineProps:接受组件的props
  • defineEmits:接受自定义事件
  • defineProps示例,defineEmits类似换个名字即可
<script setup>
//第一种
defineProps(['name', 'age'])
//第二种
defineProps({
    name: {
        type: String,
        default: "大帅比"
    }
})
//第三种
interface Type {
    name: string
}
defineProps<Type>()
</script>

defineExpose

导出组件内的变量和函数,在外层使用ref调用即可

父组件:
const myRef = ref()
<MyInput ref="myRef"></MyInput>

子组件:
<script setup>
defineExpose({
    handleBat,
    name,
    age
})
</script>

toRefs使用场景

  • 使用pinia管理全局状态,内部组件使用store可以解构出来,并套上toRefs可以保持响应式

watchEffect和watch的用法

watchEffect

  • 立即执行
  • 多个依赖的话没办法确认是那个依赖导致的更新
  • 没法获取到依赖的前后更新的值
//基本用法
watchEffect(()=>{
xxxxx
})

//延迟到组件渲染之后执行
watchEffect(()=>{},{flush:'post'})

//依赖改变立即触发
watchEffect(()=>{},{flush:'sync'})

//清除监听
const stop = watchEffect(()=>{
xxxx
})

stop()

watch

  • 懒加载
  • 明确那个依赖导致的更新
  • 可以获取到依赖的更新前后的值
//单个依赖
watch(yy,(new,old)=>{
xxx

})

//多个依赖
watch([x,y],([newX,newY],[oldX,oldY])=>{})

//深度监听
watch(()=>x,(newX,oldX)=>{},{deep:true})
或
watch(x,(newX,oldX)=>{})

//清除监听

const stop= watch(x,()=>{})
stop()

探索生命周期函数 

- 父子生命周期执行顺序

  • 挂载

  • 更新

  • 卸载

实现一个简易的Toast

import { createVNode, render } from "vue";
import Message from './message.vue'
const ToastFn = () => {
  const container = document.createElement("div");
  return {
    open: function ({...res}) {
        createVNode(Message,{...res})
        render(vNode,container)
    },
    destroy: function () {
        render(null, container);
    }
  };
};
const Toast = ToastFn()
export default Toast

Message.vue:

<template>
    <div>{{ name }}</div>
</template>
<script setup>

defineProps({
    name: {
        type: String,
        default: "大帅比"
    }
})
</script>

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

$程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值