详解Vue组件实现tips的总结


Posted in Javascript onNovember 01, 2017

官网上已经有的内容,我就不再赘述了,直接在官网上查看即可,这里蚊子想换个角度来讲解下vue的组件。

组件,顾名思义,就是把一个相对独立,而且会多次使用的功能抽象出来,成为一个组件!如果我们要把某个功能抽象为一个组件时,要做到这个组件对其他人来说是个黑盒子,他们不用关心里面是怎么实现的,只需要根据约定的接口调用即可!

我用一张图稍微总结了下Vue中组件的构成:

详解Vue组件实现tips的总结

可以看到组件中包含的东西还是蛮多的,而且,还有很多的点没有列出来,这里面的每一个知识点能都展开讲很多。不过我们这里不讲原理,只讲使用。

我们以一个tips弹窗为例,来综合运用下组件的知识点。tips弹窗,几乎所有的框架或者类库,都会有弹窗这个组件,因为弹窗这个功能平时非常普遍,而且模块解耦度高!

1. 接口约定

我们这里实现的弹窗,能用到的知识点有:props, event, slot, ref等。这里我们也能看到各个知识点是怎么运用的。

/**
 * modal 模态接口参数
 * @param {string} modal.title 模态框标题
 * @param {string} modal.text 模态框内容
 * @param {boolean} modal.showbtn 是否显示按钮
 * @param {string} modal.btnText 按钮文字
 */

 Vue.component('tips', {
  props : ['tipsOptions'],
  template : '#tips',

  data(){
    return{
      show : false
    }
  },

  computed:{
    tips : {
      get() {
        let tips = this.tipsOptions || {};
        tips = {
          title: tips.title || '提示',
          text: tips.text || '',
          showbtn : tips.showbtn || true,
          btnText : tips.btnText || '确定'
        };
        // console.log(tips);
        return tips;
      }
    }
  }
})

2. modal组件的实现

tips组件相对来说实现的比较简单,仅用作提示用户的简单弹层。

模板:

<div class="tips" v-show="show" transition="fade">
  <div class="tips-close" @click="closeTips">x</div>
  <div class="tips-header">
    <slot name="header">
      <p class="title">{{tips.title}}</p>
    </slot>
  </div>
  <div class="tips-body">
    <slot name="body">
      <p class="notice">{{tips.text}}</p>
    </slot>
  </div>
  <div class="tips-footer">
    <a href="javascript:;" rel="external nofollow" rel="external nofollow" v-if="tips.showbtn" @click="yes" >{{tips.btnText}}</a>
  </div>
</div>

模板中将结构分成了三部分,标题、内容和操作区域。这里既可以使用props传递字符串,也可以使用slot进行定制。

tips样式:

.tips {
  position: fixed;
  left: 10px;
  bottom: 10px;
  z-index: 1001;
  -webkit-overflow-scrolling: touch;
  max-width: 690px;
  width: 260px;
  padding: 10px;
  background: #fff;
  box-shadow: 0 0 10px #888;
  border-radius: 4px;
}
.tips-close{
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 20px;
  line-height: 20px;
  text-align: center;
}
.tips-header{
  text-align: center;
  font-size: 25px;
}

组件内的方法:

methods:{
  closeTips(){
    this.show = false;
  },

  yes : function(){
    this.show = false;
    this.$emit('yes', {name:'wenzi', age:36}); // 触发yes事件
  },

  showTips(){
    var self = this;
    self.show = true;

    setTimeout(function(){
      // self.show = false;
    }, 2000)
  }
}

3. 调用tips组件

首先我们开始渲染组件:

<div class="app">
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" @click="showtips">显示</a>
  <tips :tips-options="tipsOptions" ref="dialog" @yes="yes" v-cloak >
    <h3 slot="header">提示标题</h3>
    <div slot="body">
      <p>hello world</p>
      <p>wenzi</p>
    </div>
  </tips>
</div>

点击显示按钮后展示tips:

var app = new Vue({
  el : '.app',

  data : {
    tipsOptions : {
      title : 'tip'
    }
  }

  methods:{
    // 监听从组件内传递出来的事件
    yes(args){
      // console.log( args );
      alert( JSON.stringify(args) );
    },

    // 显示tips
    showtips(){
      // console.log( this.$refs );
      this.$refs.dialog.showTips();
    }
  }
})

4. 总结

在这个简单的tips组件里,我们实现了用props传递参数,用$emit向外传递参数,用slot插槽来定制内容。

需要注意的是:组件props是单向绑定,即父组件的属性发生变化时,子组件能接收到相应的数据变化,但是反过来就会出错。即不能在子组件中修改props传过来的数据,来达到修改父组件属性的目的。这是为了防止子组件无意修改了父组件的状态。

另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着你不应该在子组件内部改变 prop。如果你这么做了,Vue 会在控制台给出警告。如果真的需要在子组件里进行修改,可以用这两种方法应对:

定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],
data: function () {
 return { counter: this.initialCounter }
}

定义一个计算属性,处理 prop 的值并返回。

props: ['size'],
computed: {
 normalizedSize: function () {
  return this.size.trim().toLowerCase()
 }
}

当然,这只是单页面中组件的实现,更复杂的组件后续我们也会实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
input 输入框内的输入事件详细分析
Mar 17 Javascript
document.getElementById方法在Firefox与IE中的区别
May 18 Javascript
JS字符串截取函数实例
Dec 27 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 Javascript
Vue-cli项目获取本地json文件数据的实例
Mar 07 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 Javascript
原生javascript中this几种常见用法总结
Feb 24 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 #Javascript
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 #Javascript
js前端导出Excel的方法
Nov 01 #Javascript
JS二分查找算法详解
Nov 01 #Javascript
ES7中利用Await减少回调嵌套的方法详解
Nov 01 #Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
Nov 01 #Javascript
bootstrap Table的一些小操作
Nov 01 #Javascript
You might like
用PHP实现维护文件代码
2007/06/14 PHP
解析link_mysql的php版
2013/06/30 PHP
php实现的SESSION类
2014/12/02 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
javascript读取RSS数据
2007/01/20 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
Python splitlines使用技巧
2008/09/06 Python
你真的了解Python的random模块吗?
2017/12/12 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
教导处工作制度
2014/01/18 职场文书
母亲节演讲稿
2014/05/27 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
女生抽烟检讨书
2014/10/05 职场文书
见习报告的格式
2014/10/31 职场文书
外出考察学习心得体会
2016/01/18 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python