1.初识setUp的使用

  1. 简单介绍下面的代码功能:
  2. 使用ref函数,去使用监听某一个变量的变化,并且把它渲染到视图上。
  3. setUp函数是组合API的入口函数。这个是非常重要的。
  4. setUp可以去监听变量的变化哈!我们将会利用它
  5. ref vue中内置,需要导入。

  1. <template>
  2. <div>{{ countNum}}</div>
  3. <button @click="handerFunc">按钮</button>
  4. </template>
  5. <script>
  6. import {ref} from 'vue'
  7. export default {
  8. name: 'App',
  9. setup() {
  10. // 这一句表示的是定义了一个变量count。这个变量的初始值是100
  11. let countNum=ref(100);
  12. // 在组合API中,如果想定义一个方法,不用定义到methods中去。直接定义就可以了
  13. function handerFunc(){
  14. // console.log(countNum);//countNum是一个对象
  15. countNum.value += 10;
  16. }
  17. //在组合api中定义的方法,或者变量。如果外界需要使用,那么必须通过 return {aaa,func} 的方式暴露出去
  18. return { countNum ,handerFunc}
  19. }
  20. }
  21. </script>

2认识reactive的使用

  1. ref函数只能够去监听简单类型的数据变化。
  2. 不能够去监听,复杂类型的变化(数组、对象)。
  3. 所以我们的主角reactive就出现了。
  4. setup 中的函数会自动执行一次。

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="item in satte.arr" :key="item.id">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. console.log("setUp会自动执行的")
  16. // ref函数的注意点:
  17. // ref函数只能够去监听简单类型的数据变化,不能够去监听,复杂类型的变化(数组、对象)
  18. // reactive 方法里面是一个对象
  19. let satte=reactive({
  20. arr:[
  21. {name:"司藤",id:'0011'},
  22. {name:"皮囊之下",id:'0011'},
  23. {name:"百岁之约",id:'0012'},
  24. {name:"三生三世",id:'0013'},
  25. ]
  26. })
  27. return { satte }
  28. },
  29. }
  30. </script>

3使用reactive 实现视图的删除

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. let satte=reactive({
  16. arr:[
  17. {name:"司藤",id:'0011'},
  18. {name:"皮囊之下",id:'0011'},
  19. {name:"百岁之约",id:'0012'},
  20. {name:"三生三世",id:'0013'},
  21. ]
  22. })
  23. // 删除被点击的元素
  24. function del(index){
  25. for(let i=0;i<satte.arr.length;i++){
  26. if(index==i){
  27. satte.arr.splice(i,1)
  28. }
  29. }
  30. }
  31. return { satte, del}
  32. },
  33. }
  34. </script>

4将删除的逻辑分离出去,形成一个单独的模块

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  5. {{item.name }}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. import {reactive} from 'vue'
  12. export default {
  13. name: 'App',
  14. setup(){
  15. // onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
  16. let {satte,del }=onlyDelLuoJi();
  17. // 暴露给外界使用
  18. return { satte,del}
  19. },
  20. }
  21. function onlyDelLuoJi(){
  22. let satte=reactive({
  23. arr:[
  24. {name:"司藤",id:'0011'},
  25. {name:"皮囊之下",id:'0011'},
  26. {name:"百岁之约",id:'0012'},
  27. {name:"三生三世",id:'0013'},
  28. ]
  29. })
  30. // 删除被点击的元素
  31. function del(index){
  32. for(let i=0;i<satte.arr.length;i++){
  33. if(index==i){
  34. satte.arr.splice(i,1)
  35. }
  36. }
  37. }
  38. // 将数据satte 和方法 del 暴露出去
  39. return { satte,del }
  40. }
  41. </script>

5. 实现添加功能,事件之间传递参数

  1. <template>
  2. <div>
  3. <div>
  4. <input type="text" v-model="addobj.watchTv.name">
  5. <button @click="addHander">添加</button>
  6. </div>
  7. <ul>
  8. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  9. {{item.name }}
  10. </li>
  11. </ul>
  12. </div>
  13. </template>
  14. <script>
  15. import {reactive} from 'vue'
  16. export default {
  17. name: 'App',
  18. setup(){
  19. // onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
  20. let {satte,del }=onlyDelLuoJi();
  21. // 传递参数satte 是onlyDelLuoJi函数中提供的satte。进行传递
  22. let { addobj,addHander }=OnlyaddHander(satte);
  23. // 暴露给外界使用
  24. return { satte,del,addobj, addHander}
  25. },
  26. }
  27. //添加功能模块
  28. function OnlyaddHander(satte){
  29. console.log('初始化添加',satte)
  30. let addobj=reactive({
  31. watchTv:{
  32. name:"",
  33. id:""
  34. }
  35. });
  36. function addHander(){
  37. // 重置清空 错吴做法
  38. // satte.arr.push(addobj.watchTv)
  39. // addobj.watchTv.name = "";
  40. // addobj.watchTv.id = "";
  41. // 正确做法
  42. let oldobj = Object.assign({}, addobj.watchTv)
  43. satte.arr.push(oldobj)
  44. }
  45. return { addobj,addHander }
  46. }
  47. //删除功能模块
  48. function onlyDelLuoJi(){
  49. console.log('删除初始化')
  50. let satte=reactive({
  51. arr:[
  52. {name:"司藤",id:'0011'},
  53. {name:"皮囊之下",id:'0011'},
  54. {name:"百岁之约",id:'0012'},
  55. {name:"三生三世",id:'0013'},
  56. ]
  57. })
  58. // 删除被点击的元素
  59. function del(index){
  60. for(let i=0;i<satte.arr.length;i++){
  61. if(index==i){
  62. satte.arr.splice(i,1)
  63. }
  64. }
  65. }
  66. // 将数据satte 和方法 del 暴露出去
  67. return { satte,del }
  68. }
  69. </script>

6 将他们抽离成单独的文件

  1. 我们想在想将添加删除相关的逻辑,单独抽离成一个文件。
  2. add.js 是添加相关的逻辑
  3. del.js 是删除的相关逻辑
add.js

  1. import { reactive } from "vue"
  2. function OnlyaddHander(satte){
  3. console.log('初始化添加',satte)
  4. let addobj=reactive({
  5. watchTv:{
  6. name:"",
  7. id:""
  8. }
  9. });
  10. function addHander(e){
  11. // 重置清空 错吴做法
  12. // satte.arr.push(addobj.watchTv)
  13. // addobj.watchTv.name = "";
  14. // addobj.watchTv.id = "";
  15. // 正确做法
  16. let oldobj = Object.assign({}, addobj.watchTv)
  17. satte.arr.push(oldobj)
  18. e.preventDefault();
  19. }
  20. return { addobj,addHander }
  21. }
  22. export default OnlyaddHander
adel.js

  1. import {reactive } from "vue"
  2. function onlyDelLuoJi() {
  3. console.log('删除初始化')
  4. let satte=reactive({
  5. arr:[
  6. {name:"司藤",id:'0011'},
  7. {name:"皮囊之下",id:'0011'},
  8. {name:"百岁之约",id:'0012'},
  9. {name:"三生三世",id:'0013'},
  10. ]
  11. })
  12. // 删除被点击的元素
  13. function del(index){
  14. for(let i=0;i<satte.arr.length;i++){
  15. if(index==i){
  16. satte.arr.splice(i,1)
  17. }
  18. }
  19. }
  20. // 将数据satte 和方法 del 暴露出去
  21. return { satte,del }
  22. }
  23. export default onlyDelLuoJi
主文件
  1. <template>
  2. <div>
  3. <div>
  4. <input type="text" v-model="addobj.watchTv.name">
  5. <button @click="addHander">添加</button>
  6. </div>
  7. <ul>
  8. <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
  9. {{item.name }}
  10. </li>
  11. </ul>
  12. </div>
  13. </template>
  14. <script>
  15. import onlyDelLuoJi from "./components/del"
  16. import OnlyaddHander from "./components/add"
  17. export default {
  18. name: 'App',
  19. setup(){
  20. // onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
  21. let {satte,del }=onlyDelLuoJi();
  22. // 传递参数
  23. let { addobj,addHander }=OnlyaddHander(satte);
  24. // 暴露给外界使用
  25. return { satte,del,addobj, addHander}
  26. },
  27. }
  28. </script>
  1. 如果你觉得不错请点一个推荐。
  2. 你的推荐是我写下去的动力。非常感谢!

熬夜讲解vue3组合API中setup、 ref、reactive的用法的更多相关文章

  1. Vue3 组合式 API 中获取 DOM 节点的问题

    模板引用 Vue 提供了许多指令让我们可以直接操作组件的模板.但是在某些情况下,我们仍然需要访问底层 DOM 元素.在模板中添加一个特殊的属性ref就可以得到该元素. 访问模板引用 <scrip ...

  2. Vue3.0工程创建 && setup、ref、reactive函数 && Vue3.0响应式实现原理

    1 # 一.创建Vue3.0工程 2 # 1.使用vue-cli创建 3 # 官方文档: https://cli.vuejs.org/zh/guide/creating-a-project.html# ...

  3. Vue3 Composition API写烦了,试试新语法糖吧—setup script

    前言 Vue3发布近一年了,相信大家对Vue3的新特性,新语法都很熟悉了.那么在使用Composition API的过程中,有没有觉得整个过程比较繁琐.比如你的模板里用到了大量的state和方法的时候 ...

  4. Vue3中setup语法糖学习

    目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...

  5. jQuery EasyUI API 中文文档 - ComboGrid 组合表格

    jQuery EasyUI API 中文文档 - ComboGrid 组合表格,需要的朋友可以参考下. 扩展自 $.fn.combo.defaults 和 $.fn.datagrid.defaults ...

  6. Web API中常用Filter的执行顺序举例讲解

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  7. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  8. [Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处

    前言 如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 -- 组合式API.相信会有不少同志会陷入迷茫,因为我第一次听到新的名词 ...

  9. Vue3全局APi解析-源码学习

    本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...

随机推荐

  1. Powershell免杀

    Powershell免杀 0x01 前言 前几天搞一个站的时候,进入内网,想让内网一台机子powershell上线.然后被杀软拦截了,极其的不讲武德,想着找我极强的朋友们白嫖个免杀的方法. 后面还是没 ...

  2. hdu4768 非常规的二分

    题意:       n个社团给同学发传单,同学一共有1--2^31这么多,每个社团有三个数A ,B ,C ,只有 满足 A ,A + C ,A + C + C ...A + KC <= B 的学 ...

  3. Android木马病毒com.schemedroid的分析报告

    某安全公司移动病毒分析报告的面试题目,该病毒样本的代码量比较大,最大的分析障碍是该病毒样本的类名称和类方法名称以及类成员变量的名称被混淆为无法辨认的特殊字符,每个被分析的类中所有的字符串都被加密处理了 ...

  4. Win64 驱动内核编程-29.强制解锁文件

    强制解锁文件 强制解锁因其他进程占用而无法删除的文件. 1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄 2.打开拥有此句柄的进程并把此句柄复制到自己的进 ...

  5. Docker网络配置进阶

    Docker启动会默认创建docker0虚拟网桥,是Linux的一个bridge,可以理解成一个软件交换机.它会在挂载到它的网口之间进行转发. 之后所有容器都是在172.17.0.x的网段上,并且可以 ...

  6. ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(上)

    快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 快速开始 在开始之前,让我们确保 ...

  7. ElasticSearch7.10.0入门学习

    ElasticSearch完成最关键的一个功能就是 大数据搜索 官网:https://www.elastic.co/cn/elasticsearch/ 简介 Elasticsearch 是一个分布式全 ...

  8. Spring的配置文件 (SSM maven项目)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. OJ最大值最小化问题(分发书本)

    该类问题通用描述: 有n个物体,每个物体都有一个权值V[i],现在将n个物体连续分成m个部分,m个部分有一个部分会拿到最多的权值v.求所有分配方式中最小的v. 典型题目: 分发书本,宠物屋涂色等. 问 ...

  10. 面向对象编程OOP

    这节讲一下,什么是面向对象(Object Oriented Programming).说面向对象之前,我们不得不提的是面向过程(Process Oriented Programming),C语言就是面 ...