Vue3的学习---8

8. Vue可复用解决方案

Vue可复用方案是指在Vue.js项目中,通过创建可复用的组件、指令、插件等,来提高代码的复用性和可维护性常见的Vue可复用方案有:组件(Components)、指令(Directives)、插件(Plugins)、混入(Mixins)、高阶组件(Higher-Order Components, HOC)等。通过这些可复用方案,可以有效地减少代码重复,提高开发效率和代码质量。

8.1 自定义指令

自定义指令是Vue.js中一种强大的功能,允许你在DOM元素上绑定特定的行为。通过自定义指令,你可以封装复杂的DOM操作逻辑,并在多个组件中复用。

以下是如何创建自定义指令的详细步骤:

自定义指令可以包含几个钩子函数,例如 bindinsertedupdatecomponentUpdatedunbind。每个钩子函数都有其特定的用途。

钩子函数

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。
  • componentUpdated:指令所在组件的VNode及其子VNode全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

8.1.1 全局指令

<body><div id="app"><div v-date></div><p v-date></p></div><script src="../js/vue3.js"></script><script>let app = Vue.createApp({})// 自定义指令,directive('指令名', {指令的内容})app.directive('date', {// 指令的定义,mounted会返回一个dom对象,el是指令所在的元素mounted(el) {el.innerHTML = new Date()}})app.mount('#app')</script>
</body>

8.1.2 局部指令

<body><div id="app"><div v-date></div><p v-date></p></div><script src="../js/vue3.js"></script><script>let app = Vue.createApp({directives: {date: {mounted(el) {el.innerHTML = new Date()}}}}).mount('#app')</script>
</body>

也可以这么写:

<body><div id="app"><div v-date></div><p v-date></p></div><script src="../js/vue3.js"></script><script>const mydirective = {date: {mounted(el) {el.innerHTML = new Date()}}}let app = Vue.createApp({directives: mydirective}).mount('#app')</script>
</body>

8.1.3 指令参数

<body><div id="app"><img src="../img/jy.jpg" v-imgcir="300"></div><script src="../js/vue3.js"></script><script>const mydirective = {imgcir: {mounted(el,binding) {el.style.width = binding.value + 'px'el.style.height = binding.value + 'px'el.style.borderRadius = (binding.value/2) + 'px'}}}let app = Vue.createApp({directives:mydirective}).mount('#app')</script>
</body>

8.2 Mixin混入

Mixin混入(Mixin Mixins)是一种编程模式,主要用于在面向对象编程中,通过将一个或多个类的功能“混入”到另一个类中,从而实现代码的复用和功能的扩展。Mixin类通常不单独实例化,而是作为其他类的组成部分,为其提供特定的行为或属性。

Mixin混入的主要特点包括:

  1. 代码复用:Mixin类可以包含一些通用的方法或属性,这些方法或属性可以被多个类共享,从而减少代码重复。
  2. 灵活性:通过Mixin混入,可以在不修改原有类结构的情况下,为类添加新的功能。
  3. 多重继承:在支持多重继承的语言中,Mixin类可以被多个类继承,从而实现复杂的功能组合。

8.2.1 基本用法

<body><div id="app">{{ num }}{{ name }}{{ date }}</div><script src="../js/vue3.js"></script><script>const common = {data() {return {name: '张三'}}}const date = {data() {return {date: new Date()}}}let app = Vue.createApp({data() {return {num: 100}},mixins: [common, date]}).mount('#app')</script>
</body>

8.2.2 混入优先级

Vue中Mixin混入的优先级规则如下:

  • 数据对象(data):组件自身的数据优先级更高。
  • 生命周期钩子函数:Mixin中的钩子函数会在组件自身的钩子函数之前调用。
  • 方法(methods)、计算属性(computed)和其他选项:组件自身的定义会覆盖Mixin中的定义。
<body><div id="app">{{ num }}{{ name }}<br><button @click="add">点击</button></div><script src="../js/vue3.js"></script><script>const common = {data() {return {name: '张三',num: 200}},methods: {add() {console.log('这是Mixin混入中的方法');}},created() {console.log('vue实例创建后生命周期函数--Mixin');}}let app = Vue.createApp({data() {return {num: 100}},mixins: [common],methods: {add() {console.log('这是组件中的一个方法');}},created() {console.log('vue实例创建后生命周期函数--组件');}}).mount('#app')</script>
</body>

8.2.3 全局Mixin

<body><div id="app">{{ num }}<button @click="add">点击</button></div><script src="../js/vue3.js"></script><script>let app = Vue.createApp({})app.mixin({data() {return {num: 100}},methods: {add() {console.log('这是Mixin混入中的方法');}},created() {console.log('vue实例创建后生命周期函数--Mixin');}})app.mount('#app')</script>
</body>

8.3 插件

插件(Plugin)是一种扩展Vue功能的方式。插件可以全局地为Vue应用添加一些功能,如添加全局方法或属性、添加全局资源(指令、过滤器、过渡等)、通过全局混入(Mixin)添加一些组件选项,或者向Vue实例添加实例方法。

8.3.1 基本用法

<body><div id="app"></div><script src="../js/vue3.js"></script><script>// 插件声明有两种方式// 1、对象形式/*const MyPlugin = {// app:将使用插件的Vue实例通过app参数传入;options:参数install(app, options) {console.log('hello world');console.log(app);console.log(options);}}*/// 2、函数形式const MyPlugin = (app, options) => {console.log('hello world');console.log(app);console.log(options);}let app = Vue.createApp({})app.use(MyPlugin, { name:'张三' })app.mount('#app')</script>
</body>

8.3.2 给Vue扩展功能

<body><div id="app"><img src="../img/jy.jpg" v-imgcir="300">{{ date }}</div><script src="../js/vue3.js"></script><script>const MyPlugin = {install(app, options) {app.directive('imgcir', {mounted(el, binding) {el.style.width = binding.value + 'px'el.style.height = binding.value + 'px'el.style.borderRadius = (binding.value / 2) + 'px'}})app.mixin({data() {return {date: new Date()}}})}}let app = Vue.createApp({})app.use(MyPlugin)app.mount('#app')</script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝帽杯2020-Misc-熟悉的解密

蓝帽杯2020-MISC-熟悉的解密 前言 怎么说呢,我觉得对我一个不懂加解密算法的人来说,应该算是Crypto,不过对于专业人员来说可能TEA、AES、RSA、LCG这种应该都比较ez(like 编码?) 一、题目 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDT== Iy0qLSBjb2Rpbmc6IHV0Zi04IC0qLQ0= aW1wb3J0IHN…

051、Vue3+TypeScript基础,页面通讯之v-model的基本用法

1、main.ts代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.moun…

InternLM 2.5 书生浦语 开源大模型本地部署体验

上海人工智能实验室发布了书生浦语(InternLM)新开源版本,增强了在复杂场景下的推理能力,本文介绍在本地进行部署和推理……老牛同学之前偶尔刷到过InternLM大模型相关的介绍文章,因为在老牛同学心中,Qwen2千问才是国内开源模型中最适合自己的大模型,原因是自己在本地部署…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

在Python中,列表是一个非常灵活且常用的复合数据类型。它允许存储多个项,这些项可以是任意的数据类型,包括其他列表。列表推导式是一种简洁的方式来创建和操作列表。全网最适合入门的面向对象编程教程:37 Python 常用复合数据类型-列表和列表推导式摘要: 在 Python 中,列…

CareUEyes(调节屏幕亮度和颜色) v2.4.3.0 多语便携版

概述 CareUEyes 是一款用于调节屏幕亮度和颜色的软件,旨在保护用户眼睛的健康。它提供了多种功能和特点,使用户在使用电脑时能够更加舒适和健康。软件功能 蓝光过滤:该软件可以调整屏幕的色温,减少蓝光的强度,有助于减少眼部疲劳和视觉压力。休息提醒:软件会定时提醒用户…

050、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

ut.cpp 最大线段并减线段交 [线段树]

题意:给定n条线段的左右端点,求两条有公共点的线段的并的长度减去它们的交的长度最大(\(n<=2e5\) \(1<=L,R<=1e9\))分析:不妨设\(L_i<=L_j<=R_i\),线段异或和为\(ans\),两条线段的右端点有两种情况: 1.\(R_j>=R_i\)此时 \(ans=R_j-R_i+L_j-L_i=L_j+…

Datawhale X 李宏毅苹果书 AI夏令营 -《深度学习详解》Task1

深度学习基础 学习目标理解深度学习的常见概念。 掌握优化神经网络的方法。 找到优化神经网络失败的原因。 学习调整学习率(lr)的高级方法。1、局部极小值与鞍点 在局部极小值与鞍点之前,首先了解一个特殊的点-临界点。 1.1 临界点 通常将梯度为零的点统称为“临界点”。什…

第二周作业

登录页面示例body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: rgba(247, 247, 247, 1) } .login-container { background-color: rgba(255, 255, 255, 1); padding: 20px; border-rad…

「代码随想录算法训练营」第四十五天 | 图论 part3

目录101. 孤岛的总面积DFS思路BFS思路102. 沉没孤岛103. 水流问题104. 建造最大岛屿 101. 孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173 文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html 题目状态:看题解DFS思路 思路: 代…

carlife

carlife是真的画中画。亿连客户端不是。没去除小房子效果如下:

【专题】2024数智医疗服务时代营销机遇洞察报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37466 如今,人工智能、大数据、物联网等众多智能技术持续且深入地在医药产业中得到应用。这不仅极大地增强了医药产业的创新能力,显著提高了医疗服务的质量与效率,还有力地促进了从预防、诊断、治疗到康复的全链条数字化转型,使市场效率得…