首页 > 其他分享 >Vue3实战06-CompositionAPI+<script setup>好在哪?

Vue3实战06-CompositionAPI+<script setup>好在哪?

时间:2023-09-07 17:45:07浏览次数:57  
标签:06 computed title CompositionAPI value let Vue3 done todos

Vue 3 的Composition API +


 <script setup> 标签内定义的变量和函数,都可以在模板中直接使用。

### 1.2 显示清单应用

实现累加器后,回到src/pages/Home.vue 组件,使用如下代码显示清单应用。

直接import TodoList.vue组件,然后<script setup>会自动把组件注册到当前组件,这样我们就可以直接在template中使用  来显示清单的功能。

```vue
<template>
    <h1>这是首页</h1>
    <TodoList />
</template>

<script setup>
import TodoList from '../components/TodoList.vue'
</script>

这就把清单功能独立出来,可在任意需要的地方复用。

基于组件去搭建应用,可实现对业务逻辑的复用。如有其他页面也需要用到这功能,直接复用。

然后,就可基于新语法实现清单应用。

把之前的代码移植过来后,使用ref包裹的响应式数据。修改title和todos时,注意修改响应式数据的value属性。

<template>
  <div>
    <input type="text" v-model="title" @keydown.enter="addTodo" />
    <ul v-if="todos.length">
      <li v-for="todo in todos">
        <input type="checkbox" v-model="todo.done" />
        <span :class="{ done: todo.done }"> {{ todo.title }}</span>
      </li>
    </ul>
  </div>
</template>

<script setup>
import { ref } from "vue";
let title = ref("");
let todos = ref([{title:'学习Vue',done:false}])

function addTodo() {
  todos.value.push({
    title: title.value,
    done: false,
  });
  title.value = "";
}
</script>

2 计算属性

Composition API语法中,计算属性和生命周期等功能,都可脱离Vue的组件机制单独使用 。

向TodoList.vue加入:

<template>
  <div>
    <input type="text" v-model="title" @keydown.enter="addTodo"/>
    <button v-if="active < all" @click="clear">清理</button>
    <ul v-if="todos.length">
      <li v-for="todo in todos">
        <input type="checkbox" v-model="todo.done"/>
        <span :class="{ done: todo.done }"> {{ todo.title }}</span>
      </li>
    </ul>
    <div v-else>暂无数据</div>
    <div>
      全选<input type="checkbox" v-model="allDone"/>
      <span> {{ active }} / {{ all }} </span>
    </div>
  </div>
</template>

<script setup>
import {ref, computed} from "vue";

let title = ref("");
let todos = ref([{title: '学习Vue', done: false}])

function addTodo() {
...
}

function clear() {
  todos.value = todos.value.filter((v) => !v.done);
}

let active = computed(() => {
  return todos.value.filter((v) => !v.done).length;
});
let all = computed(() => todos.value.length);
let allDone = computed({
  get: function () {
    return active.value === 0;
  },
  set: function (value) {
    todos.value.forEach((todo) => {
      todo.done = value;
    });
  },
});
</script>

具体的计算属性的逻辑和02讲一样,区别仅在computed用法。

02讲的computed是组件的一个配置项,而这的computed的用法是单独引入使用。

3 Composition API 拆分代码

之前的累加器和清单,虽功能简单,但也属于两个功能模块。如在一个页面有俩功能,就需在data和methods里分别配置。但如此,数据和方法相关的代码会写在一起,在组件代码行数多了后难维护。

所以,要使用Composition API 逻辑拆分代码,把一个功能相关的数据和方法维护在一起。

但所有功能代码都写在一起,也有问题:随功能复杂,script内部代码越来越多。因此,可进步对代码拆分,把功能独立的模块封装成一个独立函数,做到按需拆分。

新建函数 useTodos:

function useTodos() {
  let title = ref("");
  let todos = ref([{ title: "学习Vue", done: false }]);
  function addTodo() {
    todos.value.push({
      title: title.value,
      done: false,
    });
    title.value = "";
  }
  function clear() {
    todos.value = todos.value.filter((v) => !v.done);
  }
  let active = computed(() => {
    return todos.value.filter((v) => !v.done).length;
  });
  let all = computed(() => todos.value.length);
  let allDone = computed({
    get: function () {
      return active.value === 0;
    },
    set: function (value) {
      todos.value.forEach((todo) => {
        todo.done = value;
      });
    },
  });
  return { title, todos, addTodo, clear, active, all, allDone };
}

就是把和清单相关的所有数据和方法,都放在函数内部定义并返回,这个函数就可放在任意地方维护。

而组件入口即

标签:06,computed,title,CompositionAPI,value,let,Vue3,done,todos
From: https://www.cnblogs.com/JavaEdge/p/17685644.html

相关文章

  • 米联客ZYNQ MLK-F6-CZ06-7020 开发平台硬件手册
    1整体概述米联客ZYNQ系列开发平台和核心模块经过多次迭代升级,在工业自动化、水利电力控制设备、医疗图像设备等领域广泛应用,产品性能接受了广大客户的检验,稳定可靠。2021年因芯片普遍紧缺涨价,核心模块再次升级以确保供货稳定和降低用户的使用成本。2硬件参数概述 MLK-F......
  • python基础 06while循环和for循环
    while循环当你需要重复干一件事情的时候,叫做循环age=17whileTrue:inp_age=int(input('age:'))ifinp_age>age:print('猜大了')elifinp_age<age:print('猜小了')else:print('猜对了')......
  • 用友畅捷通T+ Upload.aspx任意文件上传漏洞CNVD-2022-60632
    漏洞描述用友畅捷通T+Upload.aspx接口存在任意文件上传漏洞,攻击者通过preload参数绕过身份验证进行文件上传,控制服务器漏洞影响用友畅捷通T+漏洞复现fofa语法:app="畅捷通-TPlus"登录页面如下:上传文件类型验证不完善,可上传任意文件到服务器中的任意位置,验证POCPOST/......
  • 【2023-09-06】稳定内心
    20:00一个人如果有勇气承认错误,那么,他所犯的错误总是可以原谅的。                                                 ——李小龙何太跟我反馈说,她们单位又开始翻起数......
  • 可以无脑将Vue2项目升级到Vue3吗?
    Vue3如此优秀,是不是应该赶紧把项目都升级到Vue3?但不是所有项目都适合升级。1应该从2升到3吗?如开启一个新项目,直接使用Vue3最佳选择。以前独立使用Vue2开发应用,不管咋组织代码,无法避免在data、template、methods中上下反复横跳,这种弊端在项目规模上来后更明显。由于vue-cli基......
  • 2023-09-06
    1.一天都在做售后工作,帮客户远程调试设备,修改文件系统配置。2.C#爬虫项目,按网址要求爬取产品价格、型号、内存等参数信息,分类导入表格。3.STM32继续调试。4.无人机项目继续。5.Genshin带一个男同事小萌新。 ......
  • vue3集成jsoneditor
    一、背景之前在做录制回放平台的时候,需要前端展示子调用信息,子调用是一个请求列表数组结构,jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式,为了达到如下的效果,必须用到onNodeName的钩子函数,因此深入调研了下vue3如何集成jsoneditor最后做出来的效果图onNodeName的参考......
  • 华为S7706交换机设置 DHCP
    1.登陆S7706核心交换机后1.建立新的VLANvlan156vlan1572.为VLAN156VLAN157分别设置DHCP的POOL(也就是需要分配的地址)ippoolvlan156gateway-list10.10.156.1network10.10.156.0mask255.255.255.0excluded-ip-address10.10.156.210.10.156.50excluded-ip-ad......
  • vue3+typescript +uniapp中select标签
    <select:value="state.year"@change="handleSelectChange($event.target)"> <option:value="i"v-for="iinstate.yearrange">{{i}}</option> </select> ts的代码:``相当于v-model<se......
  • Codeforces Round 406 (Div. 2) D. Legacy 线段树优化建图
    传送门题目大意:给定n个点,m个操作,和起点s。其中n和q大于等于1小于等于1e5,s大于等于1小于等于n其中m个操作有三种情况:  1.输入1uvval表示从u号点向v号点连一个权值为val的有向边,其中1<=u<=n,1<=v<=n,1<=val<=1e9  2.输入2ulrval表示从u号点......