首页 > 其他分享 >对 Vue Hook 的理解和简单案例

对 Vue Hook 的理解和简单案例

时间:2024-08-01 20:08:42浏览次数:15  
标签:count Vue const 案例 Hook ref newTodo todos

1. Vue Hook 的理解

Vue Hook 是在 Vue 3 中引入的一种新的代码组织和状态管理方式,它受到了 React Hook 的启发。Vue Hook 主要通过组合式 API (Composition API) 来实现,让开发者能够更灵活、更高效地管理组件逻辑和状态。

2. Vue Hook 的优势

1. 更好的逻辑复用

在选项式 API (Options API) 中,逻辑复用通常依赖于 mixins 和高阶组件 (HOC)。但是,mixins 存在命名冲突和代码难以追踪的问题,而高阶组件则可能导致组件层级过深。Vue Hook 通过组合函数 (Composable) 提供了一种更简洁和直观的方式来复用逻辑。

2. 更好的代码组织

组合式 API 允许开发者在同一地方声明和使用状态、计算属性、方法等,避免了选项式 API 中将相关逻辑分散在多个选项中的情况。这使得代码更具可读性和可维护性。

3. 更灵活的响应式系统

Vue 3 引入了新的响应式系统,它基于 Proxy 实现,相较于 Vue 2 的基于 Object.defineProperty 的实现,性能更好,功能更强大。组合式 API 可以更方便地使用这些新的响应式功能。

3. Vue Hook 的核心概念

1. refreactive

  • ref 用于定义基本类型的响应式数据,它会返回一个带有 .value 属性的对象。
  • reactive 用于定义对象类型的响应式数据,它返回一个深度响应的对象。

2. 组合函数 (Composable)

组合函数是复用逻辑的核心。它是一个普通的 JavaScript 函数,可以接收参数,并返回响应式数据或其他组合函数的结果。

3. 生命周期钩子

组合式 API 提供了与选项式 API 中生命周期钩子类似的函数,如 onMountedonUpdatedonUnmounted,用于在组件的不同生命周期阶段执行特定逻辑。

简单案例:入门 Vue Hook

示例:计数器组件

以下是一个简单的计数器组件,展示了如何使用组合式 API 和 Vue Hook 来管理组件状态和逻辑。

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

// 定义一个 ref 响应式数据
const count = ref(0);

// 定义一个方法来更新 count
const increment = () => {
  count.value++;
};
</script>

 

详细解释

  1. 定义响应式数据

  • 使用 ref 定义一个响应式数据 count,初始值为 0。ref 返回一个对象,这个对象的 .value 属性是响应式的。

const count = ref(0);

 

   2.定义更新函数

const increment = () => {
  count.value++;
};

 

  • 定义一个函数 increment,每次调用时将 count.value 加 1。因为 count 是响应式的,当 count.value 发生变化时,视图会自动更新。

  • 3.在模板中使用

  • <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>

    在模板中直接使用 count 来显示计数值,并在按钮的 click 事件中绑定 increment 函数。

进阶案例:Todo 列表

<template>
  <div>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a todo" />
    <ul>
      <li v-for="(todo, index) in todos" :key="index">
        <input type="checkbox" v-model="todo.completed" />
        <span :class="{ done: todo.completed }">{{ todo.text }}</span>
        <button @click="removeTodo(index)">Remove</button>
      </li>
    </ul>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue';

const newTodo = ref('');
const todos = reactive([]);

// 组合函数
const useTodos = () => {
  const addTodo = () => {
    if (newTodo.value.trim()) {
      todos.push({ text: newTodo.value.trim(), completed: false });
      newTodo.value = '';
    }
  };

  const removeTodo = (index) => {
    todos.splice(index, 1);
  };

  return { newTodo, todos, addTodo, removeTodo };
};

const { newTodo, todos, addTodo, removeTodo } = useTodos();
</script>

<style>
.done {
  text-decoration: line-through;
}
</style>

 

详细解释

  1. 定义响应式数据

  • 使用 refreactive 定义响应式数据 newTodotodosnewTodo 是一个字符串,用于存储新待办事项的文本;todos 是一个数组,用于存储待办事项列表。

  • const newTodo = ref('');
    const todos = reactive([]);

     

  • 2.定义组合函数

const useTodos = () => {
  const addTodo = () => {
    if (newTodo.value.trim()) {
      todos.push({ text: newTodo.value.trim(), completed: false });
      newTodo.value = '';
    }
  };

  const removeTodo = (index) => {
    todos.splice(index, 1);
  };

  return { newTodo, todos, addTodo, removeTodo };
};

const { newTodo, todos, addTodo, removeTodo } = useTodos();

 

  • 定义一个组合函数 useTodos,它包含添加和移除待办事项的逻辑。useTodos 返回 newTodotodosaddTodoremoveTodo,以便在组件中使用。

  • 3.在模板中使用

  • <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a todo" />
    <ul>
      <li v-for="(todo, index) in todos" :key="index">
        <input type="checkbox" v-model="todo.completed" />
        <span :class="{ done: todo.completed }">{{ todo.text }}</span>
        <button @click="removeTodo(index)">Remove</button>
      </li>
    </ul>

     

在模板中使用 v-model 双向绑定 newTodo,并绑定 keyup.enter 事件到 addTodo 函数。在 v-for 循环中渲染 todos 列表,并为每个待办事项添加复选框和移除按钮。

标签:count,Vue,const,案例,Hook,ref,newTodo,todos
From: https://www.cnblogs.com/zx618/p/18337358

相关文章

  • SpringBoot+Vue物流快递仓库管理系统-附源码与配套论文
    1.1研究背景 随着网络不断的普及发展,物流快递仓库管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、驾驶员管理、仓库管理、配送管理、运输管理管理等功能,利用目前网络给......
  • javascript: vue create project in WebStorm
     route/index.js import{createRouter,createWebHistory,createWebHashHistory}from'vue-router'importHomeViewfrom'../views/HomeView.vue'importAboutViewfrom"../views/AboutView.vue";constrouter=createRouter(......
  • vue el-select实时搜索模糊查询,匹配文字高亮显示
    原文链接:https://blog.csdn.net/weixin_49668076/article/details/122678834参考elementuiselect的远程搜索对应属性的解释<el-selectclass="inputInfo"v-model="searchcursom"filterableclearableremote......
  • 招投标系统VUE网页编辑Word且兼容微软Office和金山WPS支持Electron
    随着信息技术的不断发展,电子政务已经非常普及,电子招投标行业市场规模不断扩大,电子招投标不仅可以减少繁琐的人工操作,提高工作效率,还能保证公开透明的招标流程,制作招标文件过程中,由于微软Office和金山WPS等办公软件无法直接内嵌到浏览器中,有的招标制作工具用的Electron,需要在纯内网......
  • 计算机毕业设计django+vue宠物领养系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和情感需求的日益增长,宠物已成为许多家庭不可或缺的重要成员。然而,宠物领养市场存在着信息不对称、流程繁琐、匹配......
  • 计算机毕业设计django+vue多彩信管团学管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在高等教育体系中,学生组织如学生会与团委扮演着举足轻重的角色,它们不仅是学生自我管理、自我服务、自我教育的重要平台,也是校园文化建设和......
  • vue播放flv、hls(m3u8)视频及动态切换视频流
    【了解video.js】官方地址: https://github.com/videojs/video.js【用法】1、安装npminstallvideo.js--savenpminstallvideojs-flash--save//rtmp格式//flv格式npminstallflv.js--savenpminstallvideojs-flvjs-es6--save//hls格式video.js7.0以后版本......
  • vue集成svg大图拖拽无限放大缩小
        vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singalR接......
  • vue+通义大模型的聊天项目
    智能聊天chat_ali_server.py为服务端,需要配置自己的阿里API_KEY,URL阿里云配置方式剩下的是客户端修改src/store/index.js中serverhost变量的值npminpmrundev应该就可以了如需定制开发,联系:18841685054Github......
  • 【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管
    随着信息技术的迅猛发展,传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验,也加重了医院工作人员的负担。在此背景下,基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化手段优化挂号流程,提高管理效率,提升医疗......