详解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 相关文章推荐
Javascript 模式实例 观察者模式
Oct 24 Javascript
js 蒙版进度条(结合图片)
Mar 10 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
Jun 09 Javascript
基于jQuery实现最基本的淡入淡出效果实例
Feb 02 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
Apr 11 jQuery
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
webpack4.0 入门实践教程
Oct 08 Javascript
node使用request请求的方法
Dec 20 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 Javascript
原生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云打印类完整示例
2016/10/15 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
js函数内变量的作用域分析
2015/01/12 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python学习教程之使用py2exe打包
2017/09/24 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python 解析简单的XML数据
2020/07/24 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
大学生村官事迹材料
2014/01/21 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
小学班主任评语
2014/12/29 职场文书
皇城相府导游词
2015/02/06 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
车辆管理制度范本
2015/08/05 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python