详解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 相关文章推荐
点击文章内容处弹出页面代码
Oct 01 Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
node.js中的fs.readdirSync方法使用说明
Dec 17 Javascript
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
利用JavaScript脚本实现滚屏效果的方法
Jul 07 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
Mar 05 Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
基于PHP pthreads实现多线程代码实例
Jun 24 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
1 Tube Radio
2021/03/02 无线电
PHP生成word文档的三种实现方式
2016/11/14 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
javascript 读取图片文件的大小
2009/06/25 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
前端性能优化及技巧
2016/05/06 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
Python脚本实现自动发带图的微博
2016/04/27 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
Python读取csv文件实例解析
2019/12/30 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
客户服务经理岗位职责
2014/01/29 职场文书
入党介绍人评语
2014/05/06 职场文书
教师个人发展总结
2015/02/11 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
甲午大海战观后感
2015/06/02 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
MySQL优化及索引解析
2022/03/17 MySQL