vue2组件封装示例
组件封装注意事项:
1、props:属性。是父容器给子组件参数传递的桥梁
2、this.$emit:事件。子组件通知父容器事件发生,并给父容器传递数据和参数
3、子组件中经常要用watch监控数据变化
思考题:如果父容器要调用子组件的方法实现一些操作,怎么办?让父容器直接调用方法吗?
(父组件中ref="player" 然后执行this.$refs.player.resetStatus()),虽然可以这样用,但是不建议这样做,
因为如果页面和组件之间可以随意调用属性和方法,如果组件比较多和复杂,页面调用逻辑将会变的非常混乱,代码会变的不可维护。
下面示例:一个播放器组件
<template>
<div style="display: flex;align-items:center;">
<div class="play" id="playpause" data-context="f" @click="handlplay">
<span>
<a-icon :type="iconfig?'pause':'caret-right'" class="icon"/>
</span>
</div> <div class="airMoniTitle" >
<p>{{timeTitle}}</p>
</div>
</div>
</template>
<script>
import {getDateYMDHMS,getDateYMDHM_CN,stringToDate,dateAdd} from '@utils/date'
export default {
name:'singleTime', //单时间组件,日期组件包含一个日期和一个小时,鼠标点击日期修改事件:changeEvent(time),
props:{
timeInterval:{
type:Number, //秒1000等于1秒,默认2秒
default:1500
},
initialDate:{//初始化日期,如果初始化不给值,则默认用当天日期,格式:yyyyMMddHHmmss
type:String
},
},
data() {
return {
timeStr:'',//时间字符串
timeTitle:'',//时间标题
iconfig:false, //false停止,true播放
Time:null, // 计时器
dataIndex:0,//播放序号
}
},
created(){
this.dataIndex=0;
if(this.initialDate)
{ //当他要初始化日期时
this.timeStr = this.initialDate;
this.timeTitle=getDateYMDHM_CN(stringToDate(this.timeStr));
}
else
{
this.timeStr = getDateYMDHMS(new Date(),'');
this.timeTitle=getDateYMDHM_CN(stringToDate(this.timeStr));
}
},
watch:{
initialDate(val){//当多次模拟的initialDate一样的时候watch不执行,这个时候要配合resetTime()一起使用
this.timeStr = val;
this.timeTitle=getDateYMDHM_CN(stringToDate(this.timeStr));
this.dataIndex=0;
},
},
methods: {
resetTime(time)
{
this.timeStr = time;
this.timeTitle=getDateYMDHM_CN(stringToDate(this.timeStr));
this.dataIndex=0;
},
resetStatus()//让播放器的状态重置
{
//console.log("reset");
clearInterval(this.Time)//清除计时器
this.Time = null;//设置为null
this.dataIndex=0;
this.iconfig=false;
},
handlplay()//播放
{
this.iconfig = !this.iconfig;
if (this.iconfig) {// 开始播放
this.Time = setInterval(() => {
if(this.dataIndex >= 13)
{//播放结束,从新开始播放
this.dataIndex=0;
let dates=dateAdd(stringToDate(this.timeStr),'f',this.dataIndex*5);
this.timeTitle=getDateYMDHM_CN(dates);
let timess=getDateYMDHMS(dates,''); this.$emit('playerTimeChange',{xh:(this.dataIndex+ 1),timestr:timess})
}
else
{//播放中
this.dataIndex = (this.dataIndex+ 1);
let dates=dateAdd(stringToDate(this.timeStr),'f',this.dataIndex*5);
this.timeTitle=getDateYMDHM_CN(dates);
let timess=getDateYMDHMS(dates,''); this.$emit('playerTimeChange',{xh:(this.dataIndex+ 1),timestr:timess})
} }, this.timeInterval)
} else {
clearInterval(this.Time)//清除计时器
this.Time = null;//设置为null
}
}
} }
</script>
<style lang="less" scoped>
#playpause{
font-family: iconfont;
font-variant: normal;
text-transform: none;
line-height: 1;
cursor: pointer;
font-size: 25px;
width: 60px;
height: 33px;
z-index: 999;
color: white;
background: rgba(0, 0, 0, 0.7);
border: 1px solid #888888;
span{
padding-top: 3px;
color: #fff;
text-align: center;
display: block;
}
}
.airMoniTitle{
width: 210px;
height: 33px;
z-index: 999;
background: rgba(0, 0, 0, 0.7);
font-size: 16px;
color: #fff;
text-align: center;
padding: 0 10px;
border: 1px solid #888888;
p{
line-height: 20px;
font-size: 16px;
font-weight: 500;
}
p:nth-child(1){
padding-top: 5px;
}
}
</style>
1、父组件中引入:
import TimePlayer from '@comp/timeLine/TimePlayer'
2、component申明:
components: {
TimePlayer,
},
3、标签使用:
<TimePlayer ref="player" :initialDate="selectedTime" @playerTimeChange="playerTimeChange"
style="z-index: 999;position: fixed;left: 250px;top: 100px;"/>
注意:组件中props下的属性,是父组件给子组件的传值,子组件中只能读取,不能修改。
vue2组件封装示例的更多相关文章
- Linux组件封装(五)一个生产者消费者问题示例
生产者消费者问题是计算机中一类重要的模型,主要描述的是:生产者往缓冲区中放入产品.消费者取走产品.生产者和消费者指的可以是线程也可以是进程. 生产者消费者问题的难点在于: 为了缓冲区数据的安全性,一次 ...
- Vuejs 页面的区域化与组件封装
组件的好处 当我用vue写页面的时候,大量的数据页面渲染,引入组件简化主页面的代码量,当代码区域块代码差不多相同时,组件封装会更加简化代码.组件是Vue.js最强大的功能之一. 组件可以扩展HTML元 ...
- ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State
开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一下,酒逢知己总是千杯少呢,喝的微醺不适合 ...
- Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)
在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着 ...
- 04.ElementUI源码学习:组件封装、说明文档的编写发布
0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...
- Masa Blazor自定义组件封装
前言 实际项目中总能遇到一个"组件"不是基础组件但是又会频繁复用的情况,在开发MASA Auth时也封装了几个组件.既有简单定义CSS样式和界面封装的组件(GroupBox),也有 ...
- Yii Framework 开发教程Zii组件-Tabs示例
有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...
- vue2组件懒加载浅析
vue2组件懒加载浅析 一. 什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 二.为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大, ...
- 网络传输 buf 封装 示例代码
网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...
- Vue + Element UI 实现权限管理系统 (功能组件封装)
组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...
随机推荐
- AndroidStudio配置 | 菜鸟教程
https://www.runoob.com/android/android-studio-install.html
- Python爬取腾讯疫情实时数据并存储到mysql数据库
思路: 在腾讯疫情数据网站F12解析网站结构,使用Python爬取当日疫情数据和历史疫情数据,分别存储到details和history两个mysql表. ①此方法用于爬取每日详细疫情数据 1 impo ...
- Hadoop_05 使用xsync脚本命令分发,手动配置脚本
在/usr/local/bin 目录下创建 xsync 文件,向里面添加 1 #!/bin/sh 2 # 获取输入参数个数,如果没有参数,直接退出 3 pcount=$# 4 if((pcount== ...
- Linux——ssh登录很慢解决方法
1.背景 在同一机房中,有多台安装了CentOS 7操作系统的服务器,它们的配置除了IP地址不同外基本相同.这些服务器的资源利用率都不高,但在使用SSH连接时,发现有几台服务器连接速度较慢,可能需要等 ...
- OpenCV一句话将彩色图片(Mat)转换为灰度
auto in_gray=cv::imdecode(in, cv::IMREAD_GRAYSCALE);
- tkinter属性--转载Tynam Yang
一.主要控件 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) 可以包含图形或位图 3.C ...
- cas登录成功后跳转地址和退出后跳转首页
cas登录成功后跳转地址和退出后跳转首页 CAS版本5.3 1.登录页面 的登录链接地址为 login.html ...<span v-if="username == ''" ...
- openGauss中如何管理表空间
openGauss 中如何管理表空间 在 openGauss 中,表空间是一个目录,在物理数据和逻辑数据间提供了抽象的一层,为所有的数据库对象分配存储空间,里面存储的是它所包含的数据库的各种物理文件. ...
- AI数字人互动大屏:如何改变我们的生活?
随着科技的飞速进步和人工智能技术的日益成熟,智能制造正在成为推动制造业转型升级的核心力量. 互动数字人具有强大的情感分析能力,可以根据观众的表情.语气等实时反馈,作出恰当而富有情感的回应.这不仅让每一 ...
- js 如何实现管道或者说组合
前言 概念:管道是从左往右函数执行,组合是从右往左执行. 实现 原理与作用后续补齐. function compose(...funcs) { return function(x) { funcs.r ...