前端:Vue学习-3

前端:Vue学习-3

    • 1. 自定义指令
    • 2. 插槽
      • 2.1 插槽 - 后备内容(默认值)
      • 2.2 插槽 - 具名插槽
      • 2.3 插槽 - 作用域插槽
    • 3. Vue - 路由
      • 3.1 路由模块封装
      • 3.2 声明式导航 router-link 高亮
      • 3.3 自定义匹配的类名
      • 3.4 声明式导肮 - 跳转传参
      • 3.5 Vue路由 - 重定向
      • 3.6 Vue路由 - 404
      • 3.7 Vue路由 - 模式设置
      • 3.8 编程式导航 - 基本跳转,传参

1. 自定义指令

自己定义的指令,可以封装一些dom操作,扩展额外功能。
全局注册,在main.js添加如下代码,以下代码为输入框自动聚焦。

// focus为指令名
Vue.directive('focus',{inserted(el){el.focus();}
})
<input type="text" v-focus>

运行结果:
请添加图片描述
局部注册,在组件内进行注册,只能在当前组件内使用该指令、

directives:{focus:{inserted(el){el.focus();}}}

inserted提供的是元素被添加到页面时的逻辑,update 指令的值被修改时触发,提供值变化后,dom更新的逻辑。上述指令并没有给值,下述代码为给指令添加值。

<template><div id="app"><p v-color='color1'>北京</p><p v-color='color2'>上海</p></div>
</template>
<script>export default {name: 'App',data(){return{color1:'red',color2:'blue'}},directives:{color:{inserted(el,binding){el.style.color = binding.value;},update(el,binding){el.style.color = binding.value;}}}
}
</script>
<style scoped>#app{width: 100px;height: 100px;margin: 20px auto;}
</style>

运行结果:
在这里插入图片描述

v-指令名=“指令值”,通过等号绑定指令的值;通过binding.value拿到指令的值

封装v-loading指令
本质loading效果就是一个蒙层,盖在盒子上;数据请求中,开启loading状态,添加蒙层;数据请求完毕,关闭loading状态,移除蒙层。

<template><div id="app"><div v-loading="loading"></div><div>哈哈</div></div>
</template>
<script>export default {name: 'App',data(){return{loading:true}},directives:{loading:{inserted(el,binding){binding.value ? el.classList.add('loading'):el.classList.remove('loading');},update(el,binding){binding.value ? el.classList.add('loading'):el.classList.remove('loading');}}},created(){setTimeout(()=>{this.loading = false;},3000);// 等待3秒,只是演示效果}
}
</script>
<style scoped>#app{width: 500px;height: 500px;margin: 20px auto;position: relative;}.loading:before{content: '';position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: rgb(242,94,94) url('./static/1.gif') no-repeat center;}
</style>

运行效果:
请添加图片描述

2. 插槽

作用:让组件内部的一些结构支持自定义,可以定制结构或内容。
在组件内需要定制的结构部分,改动<slot></slot> 占位;使用组件时,在组件内部传入结构替换slot。
注意:只有两种插槽,默认插槽和具名插槽;

MyBase组件:

<template><div><slot></slot></div>
</template>

使用

<MyBase>你好</MyBase>
<MyBase>你好2</MyBase>

这样的效果就是和下述代码一样

<div>你好
</div>
<div>你好2
</div>

2.1 插槽 - 后备内容(默认值)

封装组件时,可以为预留的’<slot>‘插槽提供默认值;直接在==<slot></slot>标签内,放置内容,作为默认显示内容==

子组件:

<template><div><slot>你好</slot></div>
</template><script>
export default {name:'MyBaseSlot'
}
</script><style></style>

父组件:

<template><div id="app"><MyBaseSlot></MyBaseSlot>    <MyBaseSlot>你好2</MyBaseSlot>   </div>
</template>
<script>
import MyBaseSlot from './components/MyBaseSlot.vue'export default {name: 'App',data(){return{loading:true}},components:{MyBaseSlot}
}
</script>
<style scoped>#app{width: 500px;height: 500px;margin: 20px auto;}</style>

运行结果:
在这里插入图片描述

2.2 插槽 - 具名插槽

一个组件内有多处结构,需要外部传入标签,进行定制。
使用,在组件内多个slot使用name属性区分名字,在调用该组件时,在该组件内使用template配合v-slot:属性名来分发对应标签,可以简化为#属性名

子组件:MyBaseSlot

<template><div><slot name="head">标题</slot><p>什么都不是</p><slot name="content">hello world!</slot></div>
</template><script>
export default {name:'MyBaseSlot'
}
</script><style></style>

父组件:

<template><div id="app"><MyBaseSlot><template v-slot:head><div class="title">我是大标题</div></template><template #content><div class="content"><p>我是内容</p><img src="./static/1.jpg" alt=""></div></template></MyBaseSlot></div>
</template>
<script>
import MyBaseSlot from './components/MyBaseSlot.vue'export default {name: 'App',data(){return{loading:true}},components:{MyBaseSlot}
}
</script>
<style scoped>#app{width: 500px;height: 500px;margin: 20px auto;border: 1px solid black;}.title{width: 100px;height: 40px;line-height: 40px;background-color: red;}.content{width: 200px;height: 240px;}.content img{width: 200px;}
</style>

运行结果:
在这里插入图片描述

2.3 插槽 - 作用域插槽

定义slot插槽时,是可以进行传值的。插槽上可以绑定数据,将来使用组件时可以用。

  1. 给slot标签,以添加属性的方式传值;
  2. 所有添加的属性,都会被收集到一个对象中;
  3. 在template中,通过 ’#插槽名=“obj”‘接收,默认插槽名为default
<template><div><table style="margin-left:10px;margin-top:10px"><tr><th>id</th><th>姓名</th><th>年龄</th><th>操作</th></tr><tr v-for="item in lists" :key="item.id"><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td><slot :id="item.id" name="btn"></slot></td></tr></table></div>
</template><script>
export default {name:'MyBaseSlot',props:{lists:Array}
}
</script><style>tr{height: 40px;}td{width: 40px;text-align: center;line-height: 40px;}table{border: 1px solid black;}
</style>
<template><div id="app"><MyBaseSlot :lists="list1"><template #btn="obj"><button @click="fn(obj.id)">删除</button></template></MyBaseSlot></div>
</template>
<script>
import MyBaseSlot from './components/MyBaseSlot.vue'export default {name: 'App',data(){return{list1:[{id:1,name:'zs',age:12},{id:2,name:'ls',age:22},{id:3,name:'ww',age:32},{id:4,name:'zl',age:19}]}},components:{MyBaseSlot},methods:{fn(id){this.list1 = this.list1.filter((item)=>item.id != id)}}
}
</script>
<style scoped>#app{width: 500px;height: 500px;margin: 20px auto;border: 1px solid black;}.title{width: 100px;height: 40px;line-height: 40px;background-color: red;}
</style>

运行结果:
请添加图片描述

3. Vue - 路由

路径和组件的映射关系。
安装VueRouter

npm install vue-router@3.6.5
import VueRouter from 'vue-router'
// 引入
Vue.use(VueRouter)
// 安装注册
const router = new VueRouter();
// 创建路由对象
注入路由对象到Vue实例中
new Vue({render:h=>h(App),router
}).$mount('#app')

在这里插入图片描述
此时的访问路径出现了“#/”
创建views目录,用来存储组件,配置路由规则。

const router = new VueRouter({routes:[{path:'/find',component:Find}]
})

配置导航,配置路由出口(路径匹配的组件显示的位置)

<a href=’#/find‘>发现</a>
<router-link to="/find">发现</router-link>
<router-view></router-view>
const router = new VueRouter({routes: [{ path: '/find', component: Find },{ path: '/myMusic', component: My },{ path: '/friend', component: Friend }]
});
<template><div id="app"><a href="#/find">发现音乐</a><router-link to="/myMusic">我的音乐</router-link><router-link to="/friend">我的朋友</router-link><router-view></router-view></div>
</template>

运行结果:
请添加图片描述
组件存放目录问题,页面组件放在views目录下,复用组件放在components目录下。

3.1 路由模块封装

把路由相关代码用单独js文件来实现,提高代码的可读性和可维护性。
index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Find from '@/views/Find.vue'
import My from '@/views/My.vue'
import Friend from '@/views/Friend.vue'Vue.use(VueRouter);const router = new VueRouter({routes: [{ path: '/find', component: Find },{ path: '/myMusic', component: My },{ path: '/friend', component: Friend }]
});export default router

main.js

import router from './router/index'

3.2 声明式导航 router-link 高亮

router-link 本质上就是a标签,配置其to属性,表示路由路径。默认会提供高亮类名。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

请添加图片描述

router-link会自动添加两个高亮类名,为router-link-active和router-link-exact-active,其中 router-link-active 模糊匹配,而router-link-exact-active 为精确匹配。
router-link-active 能够匹配 /find /find/one /find/two
router-link-exact-active 只能匹配 /find

3.3 自定义匹配的类名

router-link的两个高亮类名太长了,如何进行自定义呢?直接在VueRouter中进行配置即可。

const router = new VueRouter({routes: [{ path: '/find', component: Find },{ path: '/myMusic', component: My },{ path: '/friend', component: Friend }],linkActiveClass:'active',linkExactActiveClass:'exact-active'
});

3.4 声明式导肮 - 跳转传参

查询参数传参
to=“/path?参数名=值”
对应页面接收传递的参数值

$route.query.参数名
<template><div>发现音乐<p>{{$route.query.title}}</p></div>
</template>

请添加图片描述
动态路由传参
配置动态路由

{ path: '/find/:参数名', component: Find },

{ path: ‘/find/:参数名?’, component: Find },这种方式表示在不传参时也可以匹配到对应组件;如果用上述方式,当不传参时,则不会匹配到对应的组件。

导航链接为:

<router-link to='/find/我的梦'></router-link>

对应页面租价接收传递过来的值

$route.params.参数名

请添加图片描述
两种传参方式的区别:
查询参数传参,比较适合多个参数,获取方式通过 $route.query.参数名;动态路由传参,优雅简洁,传递单个参数比较方便,获取方式通过 $route.params.参数名

3.5 Vue路由 - 重定向

在VueRouter配置项添加redirect,如下

const router = new VueRouter({routes: [{ path: '/', redirect: '/find'},{ path: '/find/:title?', component: Find },{ path: '/myMusic', component: My },{ path: '/friend', component: Friend }],linkActiveClass:'active',linkExactActiveClass:'exact-active'
});

运行结果:
请添加图片描述

3.6 Vue路由 - 404

当路径找不到匹配时,给个提示页面;新建页面组件NotFound,然后在VueRouter配置项最后添加=={path:‘*’,component:NotFound}==,表示前面路径都没有匹配到时,跳转到这个NotFound页面。

routes: [{ path: '/', redirect: '/find'},{ path: '/find/:title?', component: Find },{ path: '/myMusic', component: My },{ path: '/friend', component: Friend },{ path: '*', component: NotFound}]

运行结果:
请添加图片描述

3.7 Vue路由 - 模式设置

两种模式:
hash模式(默认),比如:http://localhost:8080/#/find
history路由,比如:http://localhost:8080/find
直接在VueRouter配置即可,配置如下:

const router = new VueRouter({routes,mode:'history'
})

请添加图片描述

3.8 编程式导航 - 基本跳转,传参

1.path路径跳转

this.$router.push('/find')
// 简写
this.$router.push({path:'/find'
})
// 完整写法

2.name命名路由跳转(适合path路径长的场景

this.$router.push({name:'路由名'
})// 路由配置为:
{name:'路由名',path:'路径',component:xxx}

路由传参
两种传参方式:查询参数、动态路由传参
1.查询参数

this.$router.push('/find?title=我的梦&page=1&size=10')
// 简写
this.$router.push({path:'/find',query:{title:'我的梦',page:1,size:10}
})
// 详细写法

2.动态路由传参

this.$router.push('/find/我的梦')
//或
this.$router.push({path:'/find/我的梦'
})

上述两种方式参数接收方和声明式导航一样。
使用命名路由进行传参:
查询参数进行传参 query

this.$router.push({name:'路由名',query:{'参数名''值',...}
})

动态路由进行传参 params

this.$router.push({name:'路由名',params:{'参数名''值',}
})

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

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

相关文章

[题解]CF1401E.Divide Square(codeforces 05)

题目描述 There is a square of size 106106106106 on the coordinate plane with four points (0,0)(0,0) , (0,106)(0,106) , (106,0)(106,0) , and (106,106)(106,106) as its vertices. You are going to draw segments on the plane. All segments are either horizonta…

【数据结构】顺序表(ArrayList的具体使用)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 欢迎志同道合的朋友一起加油喔 &#x1f4aa;&#x1f4aa;&#x1f4aa; 谢谢你这么帅…

VSCode STM32嵌入式开发插件记录

要卸载之前搭建的VSCode嵌入式开发环境了&#xff0c;记录一下用的插件。 1.Cortex-Debug https://github.com/Marus/cortex-debug 2.Embedded IDE https://github.com/github0null/eide 3.Keil uVision Assistant https://github.com/jacksonjim/keil-assistant/ 4.RTO…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MimicMotion :利用可信度感知姿势指导生成高质量人体运动视频

目录 项目介绍 项目相关工作 图像/视频生成的扩散模型 姿势引导的人体动作转移 生成长视频 方法实践 与最先进方法的比较 消融研究 部署验证 1. 下载项目&#xff1a; 2. 建立环境 3. 下载参数模型 A. 下载 DWPose 预训练模型&#xff1a;dwpose B. 从 Huggingfa…

DDD(3)-领域驱动设计之如何建模

前言 上一篇&#xff1a;从领域驱动到模型驱动中我们讨论到&#xff0c;领域驱动设计的核心思想是保持业务-模型-代码的一致性&#xff0c;模型作为沟通业务和代码的工具&#xff0c;至关重要&#xff0c;今天这篇文章就来讨论DDD中建模的一些思考和方法。 什么是建模 虽然看…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

【Drone】drone编译web端 防墙策略 | 如何在被墙的状态drone顺利编译npm

一、drone编译防墙版本 1、web端drone kind: pipeline type: docker name: ui steps:- name: build_projectimage: node:20-slim depends_on: [clone]volumes:- name: node_modulespath: /drone/src/node_modulescommands:- pwd- du -sh *- npm config set registry https://…

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

k8s中部署nacos

1 部署nfs # 在k8s的主节点上执行 mkdir -p /appdata/download cd /appdata/download git clone https://github.com/nacos-group/nacos-k8s.git 将nacos部署到middleware的命名空间中 kubectl create namespace middleware cd /appdata/download/nacos-k8s # 创建角色 kub…

VScode连接虚拟机运行Python文件的方法

声明&#xff1a;本文使用Linux发行版本为rocky_9.4 目录 1. 在rocky_9.4最小安装的系统中&#xff0c;默认是没有tar工具的&#xff0c;因此&#xff0c;要先下载tar工具 2. 在安装好的vscode中下载ssh远程插件工具 3. 然后连接虚拟机 4. 查看python是否已经安装 5. 下载…

【状态估计】偏差,匹配和外点

我们都知道&#xff1a;对于状态的估计可能是有偏差的&#xff0c;特别是在运动模型或观测模型是非线性的情况下。在简单的立体相机的例子中&#xff0c;我们看到MAP方法相比于全贝叶斯方法来说是有偏差的。同时&#xff0c;我们也看到批量ML方法对于真实值来说也是有偏差的&am…

openEuler操作系统下Oracle 19c 从19.3补丁更新到19.17

Oracle 19c 从补丁19.3更新到19.17的过程涉及到多个步骤&#xff0c;包括备份、下载补丁、替换OPatch、验证清单信息、冲突检测、空间检测、应用补丁等。以下是一个概括性的流程&#xff0c;但请注意&#xff0c;具体步骤可能会根据实际的Oracle环境、补丁内容和Oracle的官方指…

【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】

目标&#xff1a;优化框架场景 1. 生成对应的接口关联【重点】 2. 优化URL基础路径封装【理解】 3. 利用PySQL操作数据库应用【理解】--- 怎么用python连接数据库、mysql 4. 通过数据库进行数据库断言【重点】 5. 通过数据库进行关联操作【重点】 一、接口关联&#xff1a…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

【算法/训练】:前缀和差分

&#x1f680; 前言&#xff1a; 前面我们已经通过 【算法/学习】前缀和&&差分-CSDN博客 学习了前缀和&&差分的效相关知识&#xff0c;现在我们开始进行相关题目的练习吧 1. 校门外的树 思路&#xff1a;给[0, n]的数组都标记为1&#xff0c;然后输出m行范围…

基于 PyTorch 的模型瘦身三部曲:量化、剪枝和蒸馏,让模型更短小精悍!

基于 PyTorch 的模型量化、剪枝和蒸馏 1. 模型量化1.1 原理介绍1.2 PyTorch 实现 2. 模型剪枝2.1 原理介绍2.2 PyTorch 实现 3. 模型蒸馏3.1 原理介绍3.2 PyTorch 实现 参考文献 1. 模型量化 1.1 原理介绍 模型量化是将模型参数从高精度&#xff08;通常是 float32&#xff0…

Elasticsearch:Retrievers 介绍 - Python Jupyter notebook

在今天的文章里&#xff0c;我是继上一篇文章 “Elasticsearch&#xff1a;介绍 retrievers - 搜索一切事物” 来使用一个可以在本地设置的 Elasticsearch 集群来展示 Retrievers 的使用。在本篇文章中&#xff0c;你将学到如下的内容&#xff1a; 从 Kaggle 下载 IMDB 数据集…

Linux云计算 |【第一阶段】SERVICES-DAY5

主要内容&#xff1a; 源码编译安装、rsync同步操作、inotify实时同步、数据库服务基础 实操前骤&#xff1a;&#xff08;所需tools.tar.gz与users.sql&#xff09; 1.两台主机设置SELinnx和关闭防火墙 setenforce 0 systemctl stop firewalld.service //停止防火墙 sy…

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息&#xff0c;根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…

软件更新的双刃剑:从”微软蓝屏”事件看网络安全的挑战与对策

引言 原文链接 近日&#xff0c;一场由微软视窗系统软件更新引发的全球性"微软蓝屏"事件震惊了整个科技界。这次事件源于美国电脑安全技术公司"众击"提供的一个带有"缺陷"的软件更新&#xff0c;如同一颗隐形炸弹在全球范围内引爆&#xff0c;…