可以做点赞的网站,fusionaccess免费服务器,网站建设情况的汇报,本地服务器 wordpress自定义指令
自定义指令
需求#xff1a;当页面加载时#xff0c;让元素获取焦点#xff08;一进页面#xff0c;输入框就获取焦点#xff09;
常规操作#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs input refinp type当页面加载时让元素获取焦点一进页面输入框就获取焦点
常规操作操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs input refinp typetext mounted(){ this.$refs.inp.focus() } 处在mounted这个钩子时模板已经渲染完了 全局注册指令 所有组件内均可使用 语法 Vue.directive(指令名,{ inserted (el) { el.focus() } }) inserted指令的生命周期钩子指令所绑定的元素被添加到页面时会自动调用
el是指令所绑定的元素 局部注册指令 只能在所在组件内使用 语法 directives:{ 指令名:{ inserted() { el.focus() } } } 使用input v-指令名 typetext 指令的值
需求实现一个color指令 —— 当传入不同颜色的时候标签的文字颜色也跟着变成对应的颜色
语法
v-指令名 指令值 通过等号绑定指令的值
div v-color color我是内容/div
binging.value 拿指令值通过update钩子监听指令值的变化进行dom更新操作 数据变化视图自动更新 directives:{ color:{ inserted (el,binding) { el.style.color binding.value }, update (el,binding) { el.style.color binding.value } } } el指令所绑定的元素
update指令值修改时会触发update函数 v-loading 指令封装
场景在开发过程中发送请求需要时间在请求的数据未回来时页面会处于空白状态这个时候我们就需要实现一个加载中的效果。 这个加载中的效果我们通常封装一个v-loading指令来实现 先来介绍一下伪类和伪元素 伪类已有元素在处于某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的例如:hover、:focus 伪元素创建一些不在DOM树中的元素并为其添加样式例如::before ::before 向指定元素之前插入内容 语法 元素::before{content: 要插入的内容;/* 其他属性 */
} CSS3 规范中有一部分要求为了区分伪类和伪元素伪元素使用两个冒号 (::) 伪类使用一个冒号 (:) 实现
先准备一个loading类通过伪元素定位::before设置宽高实现蒙层 这里使用的是子绝父相 添加移除蒙层 钩子里添加移除loading类 设置定时器时间一到关闭加载 使用指令 完整代码
App.vue
templatediv classmaindiv classbox v-loadingisLoadingulli v-foritem in list :keyitem.id classnewsdiv classleftdiv classtitle{{ item.title }}/divdiv classinfospan{{ item.source }}/spanspan{{ item.time }}/span/div/divdiv classrightimg :srcitem.img alt/div/li/ul/div/div
/templatescript
const axios require(axios)//加载模块
// // 安装axios yarn add axios / npm install -g axios
// import axios from axios //默认导入// 接口地址http://hmajax.itheima.net/api/news
// 请求方式get
export default {data () {return {list: [],isLoading: true,}},async created () {// 1. 发送请求获取数据const res await axios.get(http://hmajax.itheima.net/api/news)setTimeout(() {// 2. 更新到 list 中用于页面渲染 v-forthis.list res.data.datathis.isLoading false//关闭加载}, 2000)},directives: {//局部注册loading: {inserted (el, binding) {//指令所在的元素,被插入到页面中时触发binding.value ? el.classList.add(loading) : el.classList.remove(loading)},update (el, binding) {//监听指令值的变化进行dom更新操作binding.value ? el.classList.add(loading) : el.classList.remove(loading)}}}}
/scriptstyle
.loading::before {content: ;position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: #fff url(./loading.gif) no-repeat center;
}.box {width: 800px;min-height: 500px;border: 3px solid orange;border-radius: 5px;position: relative;
}.news {display: flex;height: 120px;width: 600px;margin: 0 auto;padding: 20px 0;cursor: pointer;
}
.news .left {flex: 1;display: flex;flex-direction: column;justify-content: space-between;padding-right: 10px;
}
.news .left .title {font-size: 20px;
}
.news .left .info {color: #999999;
}
.news .left .info span {margin-right: 20px;
}
.news .right {width: 160px;height: 120px;
}
.news .right img {width: 100%;height: 100%;object-fit: cover;
}
/style 插槽
默认插槽
场景组件的内容部分不希望写死希望能使用的时候自定义 —— 使用插槽
作用让组件内部结构自定义
插槽基本语法
组件内需要定制的结构部分改用slot/slot占位使用组件时MyDialog/MyDialog标签内部传入结构替换slot 默认值
语法在slot标签内放置内容作为默认显示内容 为什么引入默认值当使用组件未给我们传入具体标签或内容时显示空白用户体验不好 具名插槽 具有名字的插槽 使用场景一个组件出现 需要多处内容进行定制组件内定制多处结构
默认插槽组件内定制一处结构 区别不加名字的就是默认插槽 语法
给多个slot插槽起名将来通过name属性区分名字template配合v-slot:插槽名来分发对应标签 v-slot:插槽名 可以简化为 #插槽名 为什么用template/template包起来不包的话vue无法区分到底哪块儿是一个整体 作用域插槽 是插槽的一个传参语法 定义slot插槽的同时传值给插槽上绑定数据供将来使用组件时使用
步骤
给slot标签以 添加属性的方式传值所有属性都会被收集到一个对象中template中通过 #插槽名obj 接收 具名插槽用插槽名默认插槽插槽名用default 删除
查看