1、setup()

vue3中的composition API中最重要的就是setup方法了,相当于组件的入口,所有的composition API都必须放到setup()中的使用。

setup是在组件实例初始化之前执行的(beforeCreated之前),是整个组件的入口函数,这个时候数据和方法还没有进行挂载,因此在setup中this并不会执行当前组件实例,也不能通过this获取组件中的数据和方法了。

在模板中使用到的变量和方法必须在setup中return出来,才能使用。

export default {
setup(){
let name="张三"
return {name}//必须在这里return,模板中才能使用过
}
}

setup中的参数

上面已经说过,因为setup是在beforeCreate之前执行的,所以setup中的this并不会指向当前组件实例,this的值为undefined,那么我们怎么和父子组件通信呢(之前可以通过this.$emit触发)?这时就需要用到setup的参数了。

setup有两个参数,第一个是props,父组件传递给当前组件的prop都在这个参数对象中,第二个参数是上下文context,里面包含后attrs,emit,slots,这几个参数的用法就和vue2中的大同小异了,这里不做过多赘述。

2、ref用来定义基础类型的响应式数据

在setup中直接定义的变量不是响应式的,如果需要定义基础类型的响应式变量,需要使用ref来定义

import {ref} from "vue"
export default {
setup(){
let name = '张三';
setTimeout(() => {
name = '李四';
console.log(name);//这里的改变了,但是视图并不会更新
}, 2000);
return { name };
}
}
import {ref} from "vue"
export default {
let name = ref('张三');
setTimeout(() => {
name.value = '李四';
console.log(name.value); //李四
}, 2000);
return { name };
}

需要注意的是,通过ref定义的变量,在js中使用的时候需要通过.value来获取或者设置值,但是在模板中使用的时候不需要加.value,vue内部已经帮我们处理了。

通过ref获取dom元素或者组件实例

在vue2中要获取dom元素或者组件实例,直接在dom元素或者组件上添加ref="refName",然后在js中通过this.$refs.refName就可以获取了。在vue3中,使用方式略有不同。

  1. 直接在dom元素或者组件上添加ref="refName"
  2. 在setup中定义ref,初始值为null,let refName=ref(null),注意变量的名字一定要和dom或者组件上的ref名字保持一致。
  3. 在js中通过refName.value获取dom元素或者组件实例
  4. 注意,需要在setup总return使用到的ref变量
<template>
<div ref="name">张三</div>
<button @click="change">add</button>
<hr />
</template> <script>
import { ref } from 'vue';
export default {
setup() {
let name = ref(null);
const change = () => {
console.log(name.value);
name.value.innerText = '李四';
};
return { name, change };
},
};
</script>

3、reactive用来定义引用类型的响应式数据

import { reactive } from 'vue';
export default {
setup() {
let obj = reactive({ name: '张三', age: 18 });
setTimeout(() => {
obj.name = '李四';
console.log(obj); //李四
}, 2000);
return { obj };
},
};

在模板中直接通过{{obj.name}}就可以访问数据了

4、computed计算属性

创建只读的计算属性

import {ref,computed} from "vue"
export default {
setup(){
let count=ref(0)
let newCount=computed(()=>count.value+10)
return {count,newCount}
}
}

创建可读可写的计算属性,在computed中传入一个对象,通过设置get和set方法创建可读写的计算属性。

import { ref, computed } from 'vue';
export default {
setup() {
let count = ref(1);
let newCount = computed({
get: () => count.value + 100,
set: val => (count.value = val - 1),
});
let change = () => (newCount.value += 100);//给计算属性赋值会触发set
return { count, newCount, change };
},
}

5、watch监听

监听ref类型的单个数据

import { ref, computed, watch } from 'vue';
export default {
setup() {
let count = ref(1);
let newCount = computed({
get: () => count.value + 100,
set: val => (count.value = val - 1),
});
let change = () => (newCount.value += 100);
watch(count, (newVal, oldVal) => {
console.log(newVal, oldVal);
});
return { count, newCount, change };
},
};

监听ref类型的多个值

import { ref, watch } from 'vue';
export default {
setup() {
let name = ref('张三');
let age = ref(18); setTimeout(() => {
name.value = '李四';
age.value = 22;
}, 2000); watch([name, age], ([newName, newAge], [oldName, oldAge]) => {
console.log(newName, newAge); //李四 22
console.log(oldName, oldAge); //张三 18
});
return { name, age };
},
};

监听reactive类型的单个值

import { reactive, watch } from 'vue';
export default {
setup() {
let obj = reactive({ name: '张三', age: 18 });
setTimeout(() => {
obj.name = '李四';
}, 2000); watch(
() => obj.name,
(newVal, oldVal) => {
console.log(newVal, oldVal); //李四 张三
}
);
return { obj };
},
};

监听reactive类型的多个值

import { reactive, watch } from 'vue';
export default {
setup() {
let obj = reactive({ name: '张三', age: 18 });
setTimeout(() => {
obj.name = '李四';
obj.age = 22;
}, 2000); watch(
[() => obj.name, () => obj.age],
([newName, newAge], [oldName, oldAge]) => {
console.log(newName, newAge); //李四 22
console.log(oldName, oldAge); //张三 18
}
);
return { obj };
},
};

watch添加配置项

在vue2中watch如果需要添加配置就需要传入一个对象,来配置immediate和deep,在vue3中的watch同样可以在第三个参数里添加配置

import { ref, watch } from 'vue';
export default {
setup() {
let name = ref('张三');
let age = ref(18); setTimeout(() => {
name.value = '李四';
age.value = 22;
}, 2000); watch(
[name, age],
([newName, newAge], [oldName, oldAge]) => {
console.log(newName, newAge);
console.log(oldName, oldAge);
},
{
immediate: true,
deep: true,
}
);
return { name, age };
},
};

6、watchEffect监听

import { ref, watch, watchEffect } from 'vue';
export default {
setup() {
let name = ref('张三');
let age = ref(18); setTimeout(() => {
name.value = '李四';
age.value = 22;
}, 2000); watchEffect(() => {
console.log(name.value);
console.log(age.value);
});
return { name, age };
},
};

关闭监听

创建监听的时候可以用一个变量来接收watch或者watchEffect函数的返回值,然后在需要停止监听的地方调用这个匿名函数stop(),就可以关闭了

import { ref, watch, watchEffect } from 'vue';
export default {
setup() {
let name = ref('张三');
let age = ref(18); setTimeout(() => {
name.value = '李四';
age.value = 22;
}, 2000);
setTimeout(() => {
stop();//在这里关闭监听后,在4秒后就不会再打印信息了
name.value = '李四2';
age.value = 222;
}, 4000); let stop = watchEffect(() => {
console.log(name.value);
console.log(age.value);
});
return { name, age };
},
};

watchEffect和watch的区别

  1. watch默认是惰性的,只有当监听的变量发生改变时才会执行,watchEffect不是惰性的,组件初始化的时候就会执行,改变时也会执行。
  2. watch需要指定要监听的变量(ref和reactive类型的变量略不同),watchEffect不需要指定,在回调中使用到的响应式变量都会监听,当这些变量改变时,回调都会执行。
  3. watch可以再改变时获取到新值和旧值,watchEffect只能获取到新值。

Vue3全家桶升级指南一composition API的更多相关文章

  1. Vue3全家桶升级指南二ref、toRef、toRefs的区别

    ref是对原始数据的拷贝,当修改ref数据时,模板中的视图会发生改变,但是原始数据并不会改变. toRef是对原始数据的引用,修改toRef数据时,原始数据也会发生改变,但是视图并不会更新. 在vue ...

  2. 助你上手Vue3全家桶之Vue3教程

    目录 前言 1,setup 1.1,返回值 1.2,注意点 1.3,语法 1.4,setup的参数 2,ref 创建响应式数据 3,reactive 创建响应式数据 4,computed 计算属性 5 ...

  3. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)

    vite 最近非常火,它是 vue 作者尤大神发布前端构建工具,底层基于 Rollup,无论是启动速度还是热加载速度都非常快.vite 随 vue3 正式版一起发布,刚开始的时候与 vue 绑定在一起 ...

  4. 助你上手Vue3全家桶之Vue-Router4教程

    目录 1,前言 1,Router 2.1,跳转 2.2,打开新页面 3,Route 4,守卫 4.1,onBeforeRouteLeave 4.2,onBeforeRouteUpdate 4.3,路由 ...

  5. 开箱即用 yyg-cli(脚手架工具):快速创建 vue3 组件库和vue3 全家桶项目

    1 yyg-cli 是什么 yyg-cli 是优雅哥开发的快速创建 vue3 项目的脚手架.在 npm 上发布了两个月,11月1日进行了大升级,发布 1.1.0 版本:支持创建 vue3 全家桶项目和 ...

  6. 助你上手Vue3全家桶之VueX4教程

    目录 1,前言 2,State 2.1,直接使用 2.2,结合computed 3,Getter 3.1,直接使用 3.2,结合computed 4,Mutation 4.1,直接使用 4.2,结合c ...

  7. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇

    在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...

  8. Vue3 全家桶,从 0 到 1 实战项目,新手有福了

    前端发展百花放,一技未熟百技出.未知何处去下手,关注小编胜百书. 我是前端人,专注分享前端内容! 本篇文章主要是,使用 vite 创建一个vue3 项目,实践 vie-router4 vuex4 结合 ...

  9. Windows Composition API 指南 - 认识 Composition API

    微软在 Windows 10中 面向通用 Windows 应用 (Universal Windows Apps, UWA) 新引入了一套用于用户界面合成的 API:Composition API.Co ...

随机推荐

  1. Job for ssh.service failed because the control process exited with error code. See "systemctl status ssh.service" and "journalctl -xe" for details.

    1.按照提示 systemctl status ssh.service 查看报错原因 sshd -t 2.结果 /etc/ssh/sshd_config line 34: missing argume ...

  2. linux route命令的使用详解-(转自小C爱学习)

    route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问题:该Linu ...

  3. Navigation 实现不同fragment之间的view的共享(含动画过渡)

    以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...

  4. Spring-Cloud之Feign原理剖析

    Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于rib ...

  5. SpringCloud(八)Sleuth 分布式请求链路跟踪

    SpringCloud Sleuth 分布式请求链路跟踪 概述 为什么会出现这个技术?需要解决哪些问题? 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后 ...

  6. 基于 BDD 理论的 Nebula 集成测试框架重构(上篇)

    本文首发于 Nebula Graph 公众号 NebulaGraphCommunity,Follow 看大厂图数据库技术实践. 测试框架的演进 截止目前为止,在 Nebula Graph 的开发过程中 ...

  7. 2. Servlet3.0注解方式 @WebServlet

    web.xml配置还是比较麻烦,这次使用注解方式 编写servlet import javax.servlet.ServletException; import javax.servlet.annot ...

  8. Python+Selenium自动化-清空输入框、输入内容、点击按钮

    Python+Selenium自动化-清空输入框.输入内容.点击按钮   1.输入内容 send_keys('valve'):输入内容valve #定位输入框 input_box = browser. ...

  9. C# HTTP请求对外接口、第三方接口公用类

    /// <summary> /// 网络数据请求公共函数 /// </summary> public class HttpWebRequestCommon { #region ...

  10. GPU上稀疏矩阵的基本线性代数

    GPU上稀疏矩阵的基本线性代数 cuSPARSE库为稀疏矩阵提供了GPU加速的基本线性代数子例程,这些子例程的执行速度明显快于仅CPU替代方法.提供了可用于构建GPU加速求解器的功能.cuSPARSE ...