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组件被简化,包含导航.头部和主内容三个组 ...
随机推荐
- GeminiDB Cassandra接口新特性FLASHBACK发布:任意时间点秒级闪回
本文分享自华为云社区<GeminiDB Cassandra接口新特性FLASHBACK发布:任意时间点秒级闪回>,作者: GaussDB 数据库. 技术背景 数据库作为现代信息系统的核心组 ...
- 简直了,被“Java并发锁”问题追问到自闭...
故事 地铁上,小帅双目空洞地望着窗外...绝望,发自内心地感到绝望... 距离失业已经过去两个月了,这是小帅接到的第四次面试邀请."回去等通知吧...",简简单单的六个字,把小帅的 ...
- #容斥,广搜#nssl 1458 HR的疑惑 nssl 1460 逛机房
nssl 1458 HR的疑惑 题目 求\([1\sim n]\)中有多少个正整数\(x\)满足 \[\sqrt[y]{x}\in N^{+},y>1 \] 其中\(n\leq 10^{18}\ ...
- go~在阿里mse上使用redis.call
相关依赖 github.com/higress-group/proxy-wasm-go-sdk github.com/alibaba/higress/plugins/wasm-go 标准的redis ...
- 帕鲁重大更新!macOS 竟然也能玩了
近日,<幻兽帕鲁>迎来了 v0.2.1.0 大版本的更新. 本次更新的最大亮点是新实装的突袭头目系统.玩家可以在 "召唤祭坛" 献祭石板,从而召唤强大的突袭头目.其中, ...
- K8S 性能优化 - K8S APIServer 调优
前言 K8S 性能优化系列文章,本文为第二篇:Kubernetes API Server 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> 参数一览 ...
- Avalonia 中的样式和控件主题
在 Avalonia 中,样式是定义控件外观的一种方式,而控件主题则是一组样式和资源,用于定义应用程序的整体外观和感觉.本文将深入探讨这些概念,并提供示例代码以帮助您更好地理解它们. 样式是什么? 样 ...
- nginx重新整理——————nginx 的网络模型[九]
前言 简单介绍一下nginx的网络模型. 正文 网络拓扑图: 数据流: 网络传输大概是这样传输的. nginx 事件循环: 事件处理过程: 上面两张图什么意思呢? 其实就是说,nginx 是通过事件驱 ...
- js es6 delete
前言 首先delete 不同于nodejs delete,看下有什么不同. 正文 var test=5; delete test; console.log(test); 结果是test没有受到任何影响 ...
- js es6 Proxy
传统的get,set ES6 中引入Proxies,让你可以自定义Object的基本操作.例如,get就是Object的基础操作方法. const obj = { val: 10 }; console ...