欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Vue 2.0->3.0学习笔记(Vue 3 (三)- 其它 Composition API)

Vue 2.0->3.0学习笔记(Vue 3 (三)- 其它 Composition API)

2025/2/25 11:27:38 来源:https://blog.csdn.net/PNPYY/article/details/144158552  浏览:    关键词:Vue 2.0->3.0学习笔记(Vue 3 (三)- 其它 Composition API)

Vue 2.0->3.0学习笔记(Vue 3 (三)- 其它 Composition API)

  • 其它 Composition API
    • 1. shallowReactive 与 shallowRef
    • 2. readonly 与 shallowReadonly
    • 3. toRaw 与 markRaw
    • 4. customRef
    • 5. provide 与 inject
    • 6. 响应式数据的判断

其它 Composition API

1. shallowReactive 与 shallowRef

笔记

  • shallowReactive:只处理 对象 最外层属性的响应式(浅响应式)。
  • shallowRef:只处理 基本数据类型 的响应式, 不进行对象的响应式处理。
  • 什么时候使用?
    • 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
    • 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。
  • 目录
    在这里插入图片描述
  • Demo.vue
<template><h4>当前的x.y值是:{{x.y}}</h4><button @click="x={y:888}">点我替换x</button><button @click="x.y++">点我x.y++</button><hr><h4>{{person}}</h4><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><h2>薪资:{{job.j1.salary}}K</h2><button @click="name+='~'">修改姓名</button><button @click="age++">增长年龄</button><button @click="job.j1.salary++">涨薪</button>
</template><script>import {ref,reactive,toRef,toRefs,shallowReactive,shallowRef} from 'vue'export default {name: 'Demo',setup(){//数据// let person = shallowReactive({ //只考虑第一层数据的响应式let person = reactive({name:'张三',age:18,job:{j1:{salary:20}}})let x = shallowRef({y:0})console.log('******',x)//返回一个对象(常用)return {x,person,...toRefs(person)}}}
</script>
  • App.vue
<template><button @click="isShowDemo = !isShowDemo">切换隐藏/显示</button><Demo v-if="isShowDemo"/>
</template><script>import {ref} from 'vue'import Demo from './components/Demo'export default {name: 'App',components:{Demo},setup() {let isShowDemo = ref(true)return {isShowDemo}}}
</script>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')

2. readonly 与 shallowReadonly

笔记

  • readonly: 让一个响应式数据变为 只读 的(深只读)。
  • shallowReadonly:让一个响应式数据变为只读的(浅只读)。
  • 应用场景: 不希望数据被修改时。
  • 目录
    在这里插入图片描述
  • Demo.vue
<template><h4>当前求和为:{{sum}}</h4><button @click="sum++">点我++</button><hr><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><h2>薪资:{{job.j1.salary}}K</h2><button @click="name+='~'">修改姓名</button><button @click="age++">增长年龄</button><button @click="job.j1.salary++">涨薪</button>
</template><script>import {ref,reactive,toRefs,readonly,shallowReadonly} from 'vue'export default {name: 'Demo',setup(){//数据let sum = ref(0)let person = reactive({name:'张三',age:18,job:{j1:{salary:20}}})person = readonly(person)// person = shallowReadonly(person)// sum = readonly(sum)// sum = shallowReadonly(sum)//返回一个对象(常用)return {sum,...toRefs(person)}}}
</script>
  • App.vue
<template><button @click="isShowDemo = !isShowDemo">切换隐藏/显示</button><Demo v-if="isShowDemo"/>
</template><script>import {ref} from 'vue'import Demo from './components/Demo'export default {name: 'App',components:{Demo},setup() {let isShowDemo = ref(true)return {isShowDemo}}}
</script>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')

3. toRaw 与 markRaw

笔记

  • toRaw:
    • 作用:将一个由reactive生成的响应式对象 转为 普通对象
    • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
  • markRaw:
    • 作用:标记一个对象,使其永远不会再成为响应式对象
    • 应用场景:
      1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。
      2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。
  • 目录
    在这里插入图片描述
  • Demo.vue
<template><h4>当前求和为:{{sum}}</h4><button @click="sum++">点我++</button><hr><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><h2>薪资:{{job.j1.salary}}K</h2><h3 v-show="person.car">座驾信息:{{person.car}}</h3><button @click="name+='~'">修改姓名</button><button @click="age++">增长年龄</button><button @click="job.j1.salary++">涨薪</button><button @click="showRawPerson">输出最原始的person</button><button @click="addCar">给人添加一台车</button><button @click="person.car.name+='!'">换车名</button><button @click="changePrice">换价格</button>
</template><script>import {ref,reactive,toRefs,toRaw,markRaw} from 'vue'export default {name: 'Demo',setup(){//数据let sum = ref(0)let person = reactive({name:'张三',age:18,job:{j1:{salary:20}}})function showRawPerson(){const p = toRaw(person)p.age++console.log(p)}function addCar(){let car = {name:'奔驰',price:40}person.car = markRaw(car)}function changePrice(){person.car.price++console.log(person.car.price)}//返回一个对象(常用)return {sum,person,...toRefs(person),showRawPerson,addCar,changePrice}}}
</script>
  • App.vue
<template><button @click="isShowDemo = !isShowDemo">切换隐藏/显示</button><Demo v-if="isShowDemo"/>
</template><script>import {ref} from 'vue'import Demo from './components/Demo'export default {name: 'App',components:{Demo},setup() {let isShowDemo = ref(true)return {isShowDemo}}}
</script>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')

4. customRef

笔记

  • 作用:创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。
  • 实现防抖效果:
<template><input type="text" v-model="keyword"><h3>{{keyword}}</h3>
</template><script>import {ref,customRef} from 'vue'export default {name:'Demo',setup(){// let keyword = ref('hello') //使用Vue准备好的内置ref//自定义一个myReffunction myRef(value,delay){let timer//通过customRef去实现自定义return customRef((track,trigger)=>{return{get(){track() //告诉Vue这个value值是需要被“追踪”的return value},set(newValue){clearTimeout(timer)timer = setTimeout(()=>{value = newValuetrigger() //告诉Vue去更新界面},delay)}}})}let keyword = myRef('hello',500) //使用程序员自定义的refreturn {keyword}}}
</script>
  • 目录
    在这里插入图片描述
  • App.vue
<template><input type="text" v-model="keyWord"><h3>{{keyWord}}</h3>
</template><script>import {ref,customRef} from 'vue'export default {name: 'App',setup() {//自定义一个ref——名为:myReffunction myRef(value,delay){let timerreturn customRef((track,trigger)=>{return {get(){console.log(`有人从myRef这个容器中读取数据了,我把${value}给他了`)track() //通知Vue追踪value的变化(提前和get商量一下,让他认为这个value是有用的)return value},set(newValue){console.log(`有人把myRef这个容器中数据改为了:${newValue}`)clearTimeout(timer)timer = setTimeout(()=>{value = newValuetrigger() //通知Vue去重新解析模板},delay)},}})}// let keyWord = ref('hello') //使用Vue提供的reflet keyWord = myRef('hello',500) //使用程序员自定义的refreturn {keyWord}}}
</script>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')

5. provide 与 inject

笔记

  • 作用:实现 祖与后代组件间 通信
  • 套路:父组件 有一个 provide 选项来提供数据, 后代组件 有一个 inject 选项来开始使用这些数据
  • 具体写法:
  1. 祖组件中:

    setup(){......let car = reactive({name:'奔驰',price:'40万'})provide('car',car)......
    }
    
  2. 后代组件中:

    setup(props,context){......const car = inject('car')return {car}......
    }
    
  • 目录
    在这里插入图片描述
  • Child.vue
<template><div class="child"><h3>我是Child组件(子)</h3><Son/></div>
</template><script>import {inject} from 'vue'import Son from './Son.vue'export default {name:'Child',components:{Son},/* setup(){let x = inject('car')console.log(x,'Child-----')} */}
</script><style>.child{background-color: skyblue;padding: 10px;}
</style>
  • Son.vue
<template><div class="son"><h3>我是Son组件(孙),{{car.name}}--{{car.price}}</h3></div>
</template><script>import {inject} from 'vue'export default {name:'Son',setup(){let car = inject('car')return {car}}}
</script><style>.son{background-color: orange;padding: 10px;}
</style>
  • App.vue
<template><div class="app"><h3>我是App组件(祖),{{name}}--{{price}}</h3><Child/></div>
</template><script>import { reactive,toRefs,provide } from 'vue'import Child from './components/Child.vue'export default {name:'App',components:{Child},setup(){let car = reactive({name:'奔驰',price:'40W'})provide('car',car) //给自己的后代组件传递数据return {...toRefs(car)}}}
</script><style>.app{background-color: gray;padding: 10px;}
</style>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')

6. 响应式数据的判断

笔记

  • isRef: 检查一个值是否为一个 ref 对象
  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理
  • 目录
    在这里插入图片描述
  • App.vue
<template><h3>我是App组件</h3>
</template><script>import {ref, reactive,toRefs,readonly,isRef,isReactive,isReadonly,isProxy } from 'vue'export default {name:'App',setup(){let car = reactive({name:'奔驰',price:'40W'})let sum = ref(0)let car2 = readonly(car)console.log(isRef(sum))console.log(isReactive(car))console.log(isReadonly(car2))console.log(isProxy(car))console.log(isProxy(sum))return {...toRefs(car)}}}
</script><style>.app{background-color: gray;padding: 10px;}
</style>
  • main.js
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)//挂载
app.mount('#app')
  • 本文仅作个人学习笔记使用,无商业用途。
  • 上述内容笔记大部分摘自“B站尚硅谷”
  • 如若转载,请先声明。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词