组合式API

embedded/2024/10/5 17:57:47/

1.入口:setup

setup中的数据和方法必须return出去,模板才能使用

<script>
export default {setup () {console.log('setup');const message = 'this is a message'const logMessage = () => {console.log(message);}return {message,logMessage}},beforeCreate() {console.log('beforecreate');}
}
</script><template><div>This is div{{ message }}<button @click="logMessage">log</button></div>
</template>

但是定义一个数据就要手动导出一次,未免太麻烦了。因此vue3加入语法糖

下面是简化后的代码:

<script setup>
const message = 'this is a message'
const logMessage = () => {console.log(message)
}
</script>

2.reactive 和 ref函数

都用于生成响应式数据,但是reactive只能接收对象类型,ref可以接受对象或者简单类型

javascript">
//导入函数
import { reactive } from 'vue';//传入一个对象类型的参数 变量接收
const state = reactive ({count:0
})

在模板中调用:

<button>{{ state.count }}</button>

ref用法相同,但是在计数器案例上,对自增的操作不太一样

javascript">const setCount = () => {state.count++,count1.value++
}

对象.属性是reactive的操作,变量.value是ref的操作(本质还是把变量当做对象来处理的)

3.computed

计算属性,基本思想和vue2一样,不过是在组合式API下写法变化了。

javascript">import { computed } from 'vue';const list = ref([1,2,3,4,5,6,7,8])
const computedList = computed(()=>{return list.value.filter(item => item>2)
})
javascript">  <div>原始响应式数组-{{ list }}计算属性数组-{{ computedList }}</div>

小案例是使用filter函数计算出大于2的元素。

为了验证其是响应式,再添加一个定时器

javascript">setTimeout(()=>{list.value.push(9,10)
},3000)

4.watch

侦听器,作用:侦听数据变化,数据变化时执行回调函数

javascript">
import { watch } from 'vue';
const count2 = ref(0)watch(count2,(newValue,oldValue)=> {console.log(`count2发生变化,旧值为${oldValue},新值为${newValue}`);})

模板中配合计数器使用

侦听多个数据:

javascript">const count2 = ref(0)
const count3 = ref(0)watch([count2,count3],([newCount2,newCount3],[oldCount2,oldCount3])=> {console.log('count2 or count3 变化了',[newCount2,newCount3],[oldCount2,oldCount3]);})

immediate

在侦听器创建时立即执行回调,响应式数据变化时也执行回调

比如光标聚焦到搜索框时就出现下拉列表,输入东西后就会变化

javascript">
const count = ref(0)
const setCount = () => {count.value++
}watch(count,()=> {console.log('count变化了'); 
},{immediate:true
})

这个demo执行时,还没有点击count,控制台会先打印出count变化了

deep

深度侦听。首先,watch的默认机制:通过watch监听的ref对象默认是浅层侦听,直接修改嵌套的对象属性不会出发回调函数执行,需要开启deep。

比如直接在控制台修改上面count的值:

给count赋值为3时,不会触发count变化了,点击按钮让count++才会触发.

javascript">const state = ref({ count:0 })watch(state,()=> {console.log('count变化了'); 
},{deep:true
})const changeStateByCount = () => {state.value.count++
}

刚开始不加deep时,点击按钮控制台不会打印,加上后就可以打印了,这就是用了deep监听

缺点就是deep开启后会侦听整个对象,就是比如state有两个属性,一个是count,一个是age,但是我只想侦听age,不管count变化情况。

这时候我想到把watch的第一个属性改成state.value.age

接着就给我报错了,它说 接受的参数不符合要求,只能接受一个方法 ,整个ref对象,一个reactive对象或者元素是这几个类型的数组。所以不能接收对象里面的一个属性。但是vue有解决办法:

javascript">watch(()=>state.value.age,()=>console.log('count变化了')
)

第一个参数不能是对象的属性,但他可以是函数的返回值,让函数返回 对象的属性不就行了吗

这样就可以侦听某个属性了。

5.vue3的生命周期函数API

选项式API组合式API
beforeCreate/createdsetup
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted

javascript">
import { onMounted } from 'vue'
onMounted(()=> {console.log('组件挂载完毕,mounted执行了');
})

6.父子通信

父传子

1.父组件中给子组件绑定属性

2.子组件内部通过props选项接收

下面是son的vue文件:

这是father的:

就是import引入son的组件。通过在标签里面赋值来传给儿子,儿子在defineProps中定义这么一个变量来接收父亲传过来的数据。

如何传入响应式数据:

javascript">  <SonCom message="666666666" :count = "count"/>

在响应式数据前面加冒号。

子传父

1.父组件中给子组件标签通过@绑定事件

2.子组件内部通过$emit方法触发事件

son:

father:

7.模板引用

通过ref标识获取真实的DOM对象或者组件实例对象

defineExpose()

默认情况下语法糖<script setup>不会把组件内部的属性和方法给父最组件访问,可以通过defineExpose()暴露子组件的属性和方法。

获取模板引用的时机是:组件挂载完毕后

8.provide和inject

作用:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信

跨层传递普通数据:

1.顶层组件通过provide提供数据

2.底层组件通过inject获取数据


http://www.ppmy.cn/embedded/123488.html

相关文章

uniapp学习(003-1 vue3学习 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第11p-第p14的内容 文章目录 vue3使用介绍插值表达式例子时间戳随机数输出函数的值 ref响应式数据变量v-bind 绑…

第九章 Redis的java客户端

1. jedis 以Redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单实用。但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使用。 2. lettuce Lettuce是基于Netty实现的&#xff0c;支持同步、异步和响应式编程方式&#xff0c;并且是线程安全…

常用设计模式之单例模式、策略模式、工厂模式

单例模式 单例模式属于创建型模式 饿汉模式&#xff1a;立即加载 public class Singleton { private static Singleton instance new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 懒汉模式&#xff0c;懒加…

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

用队列实现栈,用栈实现队列

用队列实现栈 思路&#xff1a;我们利用两个队列来实现栈 1. 第一次入数据&#xff0c;两队列都为空&#xff0c;我们入第一个队列qu1 if(empty()){ qu1.offer(x); } 2. 找空队列入第二个数据 if(qu1.isEmpty()){ qu1.offer(x);}else{ qu2.offer(x);} 3. 将不入数据的队列中的元…

大数据复习知识点5

HDFS读流程、写流程&#xff1a; 写流程&#xff1a;Client将文件切分成多个Block&#xff0c;然后逐个上传。Client与NameNode交互&#xff0c;获取文件存储的位置信息。Client根据位置信息&#xff0c;与相应的DataNode交互&#xff0c;写入数据块。 读流程&#xff1a;Cli…

WPF入门教学二十三 自定义控件开发

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;自定义控件开发是一项强大的功能&#xff0c;它允许开发者根据特定需求创建独特的用户界面元素。自定义控件可以是简单的用户控件&#xff0c;也可以是更复杂的继承自现有控件的自定义控件。以下是…

Set有哪些方法

Set作为一种数据结构&#xff0c;在不同的编程语言中有不同的实现方法和功能。以下是一些常见的编程语言中Set的方法&#xff1a; 一、Java中的Set方法 Java中的Set接口继承了Collection接口&#xff0c;因此它具有Collection中的所有方法。Set主要用于存储不重复的元素。以下…