vue3知识盲点总结

@1 ref既可以定义基本数据类型,也可以定义对象数据类型。ref在使用watch的时候没有默认deep
        为true,react定义的对象类型数据在使用watch的时候默认是开启的deep为true的。

@2 ref为对象重新赋值的时候不会失去响应式的,而reactive重新分配一个对象不是响应式的,如果想要响应式的需要使用 object.assign(源对象,要覆盖的对象)。

@3 可以定义一个计算属性为可读可写的
        const a = ref(10)
        const count = computed({
         get () { return a.value },
         set(value){ a.value= value}
        })

@4 watch也有返回值 
        const stopWatch =  watch(a,(value)=>{ 
                 if(a>20){
                        stopWatch() // 如果符合条件,监听器不再监听a的变化
                 }
         })

@5 watchEffect // 监视数据 依赖到哪个数据 就直接监听到哪个数据了
        watchEffer(()=>{
                if(a>20) {

                     .. 向服务器发送请求
                 }
        })

@6 definedExport({...接受需要对外暴露的数据})父组件如果通过ref获取子组件的数据和方法的
        时候,因为子组件的数据是受保护的私有的,需要向外暴露。不需要引入。

@7 关于ts的使用,定义一个接口
        interface PersonInter {  //定义了一个对象类型的接口
                name:string,
                age:number,
                sex?:string
        }
        定义一个数组对象类型的接口
        type Persons = Array<PersonInter>  // 也能写为 PersonInter[ ]
        在组件中使用:
        import {type PersonInter} from '../.'
        let personList = reactive<Persons> = [ {name:'zs',age:12},{...},{...}]

@8 接收父组件传递的数据 并限制类型 加上默认值
        只接收
        defineProps(['list'])
        限制类型
        defineProps<{list:Persons}>()
        限制类型 指定默认值
        withDefault(defineProps<{list?:Persons}>(), {list:()=>[{name:'zs',age:12}] } )
        拥有返回值在setup中可以访问
        let x = defineProps['list']

@9  Hook组件 就是把相同的数据和操作数据的方法封装在同一个ts文件中,并向外导出数据和方法,在组件中引入并使用就可以了。
        import {ref} from 'Vue'
        import axios from 'axios'
        export default function () {
                const a = ref(10)
                const addA = ()=>{
                        a.value += 1
                 }
                return {a,addA}
        }
        组件中导入 import useCount from ‘./...’
        const {a,addA} = useCount()
        组件中再使用就可以了

@10 pinia的使用
        第一步 安装 pinia
        第二步 main.ts文件中导入 import {createPinia} from 'pinia'
        第三步 创建pinia  const pinia = createPinia()
        第四步 挂载 app.use(pinia)
        第五步 创建store文件夹 使用独立的模块管理
        import {defineStore} from 'pinia'
        export const useCountstore = defineStore('count',{ // count是store容器的名字
                state() { // 存储数据的地方
                        return {
                                sun:10
                        }
                },
                actions:{
                        changeSun(value){ // 修改数据  这里面也可以做异步获取数据的方法
                                this.sun+=value // this代表整个容器
                        }
                }
        })
        第六步 组件中使用
        import {useCounstore} from './store/count'
        const countStore = useCountStore()
        获取数据
        countStore.sun
        获取修改数据的方法
        countStore.changeSun(10) // 调用方法 传递参数
        第七步 使用storeToRefs将结构出来store中的数据变成响应式的
        import {storeToRefs} from ‘pinia’
        mport {useCounstore} from './store/count'
        const countStore = useCountStore()
        // $subscibe 监听store数据发生变化 同时将数据存储到本地
        countStore.$subscribe((mutate,state)=>{localstoreage.setItem('sun',JSON.stringfy(sun))}) 
        const {sun} = storeToRefs(countStore.sun) // 将数据变为响应式的
        在组件中也可以不同cations的方法直接修改store里面的数据
        第七步 getters的使用
        getters:{
                bingSun(state){
                        return state.sun+10
                }
        }
@11 组件之间的传递方式
        第一种 父->子:
                父组件 <children name='zs' age='18'  changeFn="()=>{console.log('...')}"></children>
                子组件 defiendProps(['name','age','changeFn'])
        第二种 子->父:
                父组件 <children  @changeSun = "getSun"/>
                const getSun = (value)=>{console.log(value)}
                子组件 <button @click="sendSun">
                const emit = defiendEmit(['changeSun'])
                sendSun(){ emit('changeSun', 10) }
        第三种 emit:
                // 创建mitt.ts文件
                import mitt from 'mitt'
                const emitter = mitt()
                export default emiiter
                // 组件中使用
                import emitter from './..'
                发送数据使用 @click=“()=>{emitter.emit('sendSun', 10 )}”
                接受数据 @click=()=> {emitter.on('sendSun',(value)=>{console.log(value)})}
        第四种 v-model
                父组件
                <children v-model="count"></children>
                <children :modelValue="count" @update:modelvalue="count=$event">   
                子组件需要接受
                defieneProps(['count'])
                const emit = defieneEmits(['update:modelvalue'])
                <input :value="count"
                @input="emit('update:modelvalue'<HtmlInputElement>$event.targer.value)"
                 />
        第五种:$sttrs
                祖->孙
                通过祖 父 再到孙
                祖组件给父组件传递属性 <children a="10" b="20">
                父组件此刻不是有props接受 所有传递的属性都存在$sttrs上面了
                父组件 <Sun v-bind="$sttrs"> 传给孙组件
                孙组件defineProps([a,b])
        第六种 $refs  $parents
                父组件给通过给子组件绑定ref获取子组件的实例 然后通过$refs就可以获取所有绑定
                ref属性的子组件的实例得到的是一个数组。@click=“getChildren($refs)”
                $parent主要是用来获取父组件的实例 @click="getparent($parent)"
        第七步 project inject
                父组件 project(‘名字’,传递的值)
                孙组件 const a = inject(‘名字’ , '也可以设置默认值')

@12  自定义的ref   customRef
        let initval = ''
        let time =null
        let msg = customRef((track,trigger)=>{
                return {
                        get() {
                                track() // 持续根据数据发生的变化
                                return initval
                        },
                        set(value){
                                clearTimeout(timer)
                                // 这里可是使用定时器 延迟使用 相当于防抖
                                timer = setTimeout(()=>{
                                         initval = value
                                        trigger() // 通知vue数据msg发生了变化
                                },1000)
                        }

                }
        })
        
        
                            
        
        
        
        
        
        
        

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

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

相关文章

AArch64 memory management学习(一)

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网参考文档为准。AArch64 memory management学习一共分为两章&#xff0c;这是第一…

GD32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件(附代码)

资料下载: https://download.csdn.net/download/wouderw/88714985 一、概述 关于IAP的原理和Ymodem协议&#xff0c;本文不做任何论述&#xff0c;本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级&#xff0c;以及bootloader和主程序两个工程的配置…

LeetCode每日一题.07(整数反转)

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输…

【算法提升】LeetCode每五日一总结【01/01--01/05】

文章目录 LeetCode每五日一总结【01/01--01/05】2023/12/31今日数据结构&#xff1a;二叉树的前/中/后 序遍历<非递归> 2024/01/01今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代码<非递归>今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代…

Windows系统任务栏应用图标显示成空白的解决方案

背景 任务栏应用图标为空白&#xff1a; 原因 Windows系统为了加快系统响应速度&#xff0c;在安装完应用第一次显示完应用图标后&#xff0c;会将应用的图标放入缓存中&#xff0c;以后每次显示应用直接在缓存中获取&#xff0c;如果缓存中的图标信息发生错误&#xff0c;…

09-责任链模式-C语言实现

责任链模式&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.&#xff08;使多个对象都有…

Java学习苦旅(二十三)——二叉搜索树

本篇博客将详细讲解二叉搜索树。 文章目录 二叉搜索树概念操作查找插入删除 性能分析 结尾 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根…

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

最新ChatGPT网站系统源码+详细搭建部署教程+Midjourney绘画AI绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

CogVLM多模态大模型训练代码详细教程(基于vscode调试与训练)

文章目录 前言一、cogvlm环境安装1、apex问题2、en_core_web_sm问题 二、launch.json文件配置1、finetune_cogvlm_lora.sh被配置内容2、launch.json文件配置3、debug调试展示 三、训练源码解读1、权重问题2、数据问题3、训练模型参数修改4、训练源码解读5、训练结果展示 前言 …

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

weak_ptr如何能做到解决循环引用又能传递参数呢?

引子&#xff1a;今天在看CLR via C#的时候看到C#的垃圾回收算法--引用跟踪算法的时候想到以下几个问题。 一、引用计数法存在的问题 一般引用计数法存在的问题就是不好处理循环引用的问题&#xff0c;但是C不是有weak_ptr吗&#xff1f; 这个引用跟踪的垃圾回收算法看起来还…

MySQL忘记密码,如何重置密码(Windows)

1. 停止MySQL服务 打开“服务”管理工具&#xff08;可以在开始菜单搜索“服务”或运行 services.msc&#xff09;。 找到你的MySQL服务&#xff0c;可能叫别的&#xff0c;但是应该都是mysql开头的。 鼠标右键停止运行它。 2. 跳过权限表启动 MySQL 打开命令提示符&#x…

HTML5 新元素

新多媒体元素 标签描述<audio>定义音频内容<video>定义视频&#xff08;video 或者 movie&#xff09;<source>定义多媒体资源 <video> 和 <audio><embed>定义嵌入的内容&#xff0c;比如插件。<track>为诸如 <video> 和 <…

理论U2 贝叶斯决策理论

文章目录 一、概率统计理论基础1、乘法公式2、全概率公式3、贝叶斯公式 二、贝叶斯决策理论1、用处2、解决问题3、决策基础4、一些概念5、核心公式 三、最小错误率贝叶斯决策1、目标2、例题分析3、问题1&#xff09;决策的风险 四、最小风险贝叶斯决策1、背景2、基本概念1&…

西电期末1034.勒让德多项式

一.题目 二.分析与思路 带递推式即可&#xff0c;注意数据类型的使用和转换&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 int main() {int n;double x;scanf("%d%lf",&n,&x);double ans0;double num[n];num[0]1;num[1]x;//初始化ansnum…

VS2017 CMake编译Opencv

先下载opencv4.2.0源码以及opencv_contrib-4.2.0 地址链接&#xff1a;https://pan.baidu.com/s/1AgFsiH4uMqTRJftNXAqmTw?pwd3663 提取码&#xff1a;3663 先建立一个opencv_debug和opencv_release文件夹这两个都是为了后续存放编译好的debug版本和release版本opencv的&#…

jaeger简单发送---链路追踪

jaeger go发送单个span package mainimport ("fmt""github.com/uber/jaeger-client-go"jaegercfg "github.com/uber/jaeger-client-go/config" )func main() {cfg : jaegercfg.Configuration{Sampler: &jaegercfg.SamplerConfig{ //采样类…

小程序 蓝牙连接与回连过程

小程序蓝牙连接过程包括扫描设备、连接设备和发送数据等步骤 具体步骤如下&#xff1a; 打开蓝牙&#xff1a;在小程序中调用wx.openBluetoothAdapter()函数打开蓝牙适配器。 监听蓝牙适配器状态&#xff1a;使用wx.onBluetoothAdapterStateChange()函数监听蓝牙适配器的状态…

2023年12 月电子学会Python等级考试试卷(一级)答案解析

青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 下列程序运行的结果是?( ) print(hello) print(world) A. helloworld