首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,073 阅读
2
类的加载
737 阅读
3
Spring Cloud OAuth2.0
725 阅读
4
SpringBoot自动装配原理
689 阅读
5
集合不安全问题
582 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
388
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
页面
统计
关于
搜索到
3
篇与
的结果
2022-07-17
其他Composition API
1. shallowReactive与shallowRefshallowReactive:只处理对象最外层属性的响应式(浅响应式)shallowRef:只处理基本数据类型的响应式,不进行对象类型的响应式处理使用场景:如果有一个对象数据,结构比较深,但变化时只是第一层(外层)属性变化 ---> shallowReactive如果有一个对象数据,后续功能不会修改该对象中的属性,而是生成一个新的对象来替换 ---> shallowRef2. readOnly与shallowReadOnlyreadOnly:让一个响应式数据变为只读的(深只读)shallowReadOnly:让一个响应式数据变为只读的(浅只读)应用场景:不希望数据被修改时(如:使用的数据是别人传过来的)3. toRaw与markRawtoRow:作用:将一个由 reactive 生成的响应式对象转为普通对象使用场景:用于读取响应式对象对应的普通对象,对这个普通普通对象的所有操作,不会引起页面更新markRaw:作用:标记一个对象,使其永远不会成为响应式对象应用场景:有些值不应被设置为响应式的,如复杂的第三方类库当渲染的对象是不可变数据源的复杂/大列表时,跳过响应式转换可以提高性能4. customRef作用:自定义 ref ,并对其依赖项跟踪和更新触发进行显示控制实现防抖效果:<template> <br> <input type="text" v-model="keyWord"> <h3>{{keyWord}}</h3> </template> <script> import {customRef, ref} from "vue"; export default { name: 'MyDemo', setup() { //数据 //Vue提供的ref //let keyWord = ref('你好') function myRef(value, delay) { return customRef((track, trigger) => { let timer return { get() { console.log(`有人从自定义的myRef容器中读取了数据,value:[${value}]`) //通知Vue追踪value的变化 track() //2.读取 return value }, set(newValue) { console.log(`有人修改了自定义myRef容器中的数据,newValue:[${newValue}]`) clearTimeout(timer) timer = setTimeout(() => { //1.设置值 value = newValue //3.通知Vue重新解析模板 trigger() }, delay) } } }) } //使用自定义的ref let keyWord = myRef('你好', 500) return { keyWord } } } </script> <style scoped> </style>5. provide与inject作用:实现祖组件与后代组件间的通信实现:<!-- 祖组件 --> setup() { ...... let car = reactive({name: '马自达', price: '10w'}) //给后代组件传递数据 provide('car', car) ...... } <!-- 后代组件 --> setup() { ...... let car = inject('car') return {car} ...... }6. 响应式数据的判断isRef:检查是否是 ref 对象isReactive:检查是否是 reactive 对象isReadOnly:检查一个对象是否是由 readOnly 创建的只读代理对象isProxy:检查一个对象是否是由 reactive 或 readOnly 创建的代理对象
2022年07月17日
53 阅读
0 评论
0 点赞
2022-07-17
新的组件
1. FragmentVue2:组件必须有一个根标签Vue3:组件可以没有根标签,内部会将多个标签包含在一个 Fragment 虚拟元素中减少标签层间,性能优化2. Teleport概念:将 组件html结构 移动到指定位置<teleport to="body"> <div v-if="isShow" class="mask"> <div class="dialog"> <h3>你好</h3> <h4>孙笑川</h4> <h4>药水哥</h4> <h4>Giao哥</h4> <button @click="isShow = false">关闭弹窗</button> </div> </div> </teleport>3. Suspense等待异步组件时渲染定义的缺省内容,提升用户体验实现:引入异步组件import {defineAsyncComponent} from "vue"; const Child = defineAsyncComponent(() => import('./components/Child'))使用 Suspense 包裹组件,并配置好 default 和 fallback<template> <div class="app"> <h3>App组件</h3> <Suspense> <template v-slot:default> <Child/> </template> <template v-slot:fallback> <h3>加载中...</h3> </template> </Suspense> </div> </template>
2022年07月17日
20 阅读
0 评论
0 点赞
2022-07-17
常用Compsition API
1. setupVue3.0中一个新的配置项,值为一个函数,组件中所用到的数据、方法等均配置在setup中,有两种返回结果:(1)返回一个对象:则对象中的属性、方法可以直接在模板中使用(常用)(2)返回一个渲染函数:可以自定义渲染内容(3)注:setup 不能是一个 async 函数,因为返回值不再是 return 的对象,而是 Promise,模板看不到 return对象中的属性(后期可以是返回 Promise 实例,但需要 Suspense 和异步组件的配合)2. ref函数作用:定义一个响应式的数据语法:const xxx= ref(initValue)创建一个包含响应式数据的引用对象(reference对象,简称ref对象)在js中操作ref对象:xxx.value在模板中读取时不需要手动写.value,直接{{xxx}}补充:接收的数据可以是基本类型,也可以是对象类型基本类型数据:响应式依然通过 Object.defineProperty() 的 get 与set 完成对象类型的数据:内部求助Vue3.0的 reactive 函数来实现3. reactive函数作用:定义一个对象类型的响应式数据(基本类型使用ref)语法:const 代理对象 = reactive(源对象) 接收一个对象或数组,返回一个代理对象(即Proxy的实例对象,简称Proxy对象)reactive 定义的响应式数据是深层次的内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作4. Vue3.0的响应式实现原理:通过Proxy(代理):拦截对象中任意属性的变化(增删查改)通过Reflect(反射):对源对象的属性进行操作Demo//源数据 let person = { name: '孙笑川', age: 33 } const p = new Proxy(person, { //读取时调用 get(target,propName) { console.log(`p身上的${propName}属性被读取了`) return Reflect.get(target, propName) }, //修改/追加时调用 set(target,propName,value) { console.log(`p身上的${propName}属性被修改了,执行页面更新`) Reflect.set(target, propName, value) }, //删除时调用 deleteProperty(target, propName) { console.log(`p身上的${propName}属性被删除了,执行页面更新`) return Reflect.deleteProperty(target, propName) } })5. reactive与ref的区别从定义数据的角度ref 定义基本数据类型reactive 定义对象或数组类型ref也可以定义对象或数组类型,底层会通过 reactive转为代理对象从原理的角度分析ref 通过 Object.defineProperty() 的 get 与 set 方法来实响应式(数据劫持)reactive 通过 Proxy 来实响应式(数据劫持),并通过 Reflect 操作源对象内部的数据从使用角度ref 定义的数据:操作数据时需要 .value,在模板中使用时不需要 .valuereactive 定义的数据:操作时直接使用即可6. setup的两个注意点setup执行的时机在 beforeCreate 之前执行一次,this 是 undefinedsetup的参数props:值为对象,包含组件外部传递过来,且组件内部声明接收了的属性context:上下文对象attrs:值为对象,包含组件外部传递过来,但没有在 props 配置中声明的属性,相当于 this.$attrsslots:收到的插槽内容,相当于 this.$slotsemit:分发自定义事件的函数,相当于 this.$emit7. computed函数与Vue2.x中一致示例:import {computed, reactive} from "vue"; export default { name: 'MyDemo', setup() { //数据 let person = reactive({ firstName: '孙', lastName: '笑川' }) //计算属性(简写) // person.fullName = computed(() => { // return person.firstName + '-' + person.lastName // }) //计算属性(完整写法) person.fullName = computed({ get() { return person.firstName + '-' + person.lastName }, set(value) { const nameArr = value.split('-') person.firstName = nameArr[0] person.lastName = nameArr[1] } }) return { person } } }8. watch函数与Vue2.x中一致注意:监视 reactive定义的响应式数据时,oldValue 无法正确获取,强制开启了深度监视(deep配置失效)监视 reactive定义的响应式数据中的某个属性(对象)时:deep 配置有效//情况一:监视ref定义的一个数据 watch(sum, (newValue, oldValue) => { console.log('sum变了',newValue, oldValue) }) //情况二:监视ref定义的多个数据 watch([sum, msg], (newValue, oldValue) => { console.log('sum变了', newValue, oldValue) }, {immediate:true}) /* 情况三:监视reactive定义的一个数据中的全部属性 注意:1.此处无法正确获取oldValue 2.强制开启了深度监视(deep配置无效) */ watch(person, (newValue, oldValue) => { console.log('person变了',newValue, oldValue) }, {deep: false}) //此处的deep配置无效 //情况四:监视reactive定义的一个数据中的某个属性 watch(() => person.name, (newValue, oldValue) => { console.log('person变了',newValue, oldValue) }) //情况五:监视reactive定义的一个数据中的某些属性 watch([() => person.name, () => person.age], (newValue, oldValue) => { console.log('person变了',newValue, oldValue) }) //特殊情况 watch(() => person.job, (newValue, oldValue) => { console.log('person变了',newValue, oldValue) }, {deep:true}) //此处由于监视的是reactive定义的对象中某个属性,所以deep配置有效9. watchEffect函数watch与watchEffect的区别:watch 既要指明监视的属性,也要指明监视的回调watchEffect 无需指明监视的属性,在监视的回调中用到哪个属性,那就监视哪个属性watchEffect与computed相似:computed 注重计算出来的值(回调函数的返回值),必须写返回值watchEffect 更注重过程(回调函数的函数体),不用写返回值//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调 watchEffect(() => { const a = sum.value const b = person.job.j1.salary console.log('watchEffect配置的回调执行了') })10. 生命周期<script> import {onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref} from "vue"; export default { name: 'MyDemo', setup() { //数据 let sum = ref(0) //通过组合式API的形式使用 onBeforeMount(() => { console.log('---onBeforeMount---') }) onMounted(() => { console.log('---onMounted---') }), onBeforeUpdate(() => { console.log('---onBeforeUpdate---') }), onUpdated(() => { console.log('---onUpdated---') }), onBeforeUnmount(() => { console.log('---onBeforeUnmount---') }), onUnmounted(() => { console.log('---onUnmounted---') }) return { sum } }, //通过配置项的形式使用生命周期钩子 /* beforeCreate() { console.log('---beforeCreate---') }, created() { console.log('---created---') }, beforeMount() { console.log('---beforeMount---') }, mounted() { console.log('---mounted---') }, beforeUpdate() { console.log('---beforeUpdate---') }, updated() { console.log('---updated---') }, beforeUnmount() { console.log('---beforeUnmount---') }, unmounted() { console.log('---unmounted---') } */ } </script>11. 自定义hook函数本质是一个函数,把 setup 中使用的Composition API进行了封装类似于Vue2.x中的mixin优势:代码复用,逻辑清晰12. toRef作用:创建一个 ref 对象,其 value 值指向一个对象中的某个属性语法:const name = toRef(person, 'name')应用:要将响应式对象中的某个属性单独提供给外部使用时扩展:toRef 与 toRefs 功能一致,但可以批量创建多个 ref 对象,语法:toRefs(person)
2022年07月17日
44 阅读
0 评论
0 点赞