vue 开发一个按钮组件的示例代码


Posted in Javascript onMarch 27, 2018

最近面试,被问到一个题目,vue做一个按钮组件;

当时只是说了一下思路,回来就附上代码。

解决思路:

  1. 通过父子组件通讯($refs 和 props)
  2. props接受参数, $refs调用子组件的方法
  3. 来达到点击提交改变按钮状态,如果不成功则取消按钮状态

在src/components/ 下建一个button.vue

<template>
<!-- use plane -->
<!-- 传入bgColor改变按钮背景色 -->
<!-- state切换button的状态 调用cancel()可以切换 -->
<!-- text为按钮文字 -->
 <div class="container">
  <button 
   @click="confirm"
   :disabled="state" 
   class="confirm" 
   :style="{background: btnData.bgColor}"
  >{{text}}</button>
 </div>
</template>
<script>
export default {
 data(){
  return {
   text: this.btnData.text,
   state: false,
  }
 },
 props: {
  btnData: {
   types: Array,
   default() {
    return {
     text: '确认',
    }
   }
  }
 },
 methods: {
  confirm(){
   this.text += '...'
   this.state = true
   //这里是激活父组件的事件,因为子组件是不会冒泡到父组件上的,必须手动调用$emit
   //相对应父组件要在调用该组件的时候,将其挂载到上面
   this.$emit("confirm")
  },
  cancel(){
   this.text = this.btnData.text
   this.state = false
  }
 }
}
</script>
<style lang="less" scoped>
.confirm {
 border: none;
 color: #fff;
 width: 100%;
 padding: 1rem 0;
 border-radius: 4px;
 font-size: 1.6rem;
 background: #5da1fd;
 &:focus {
  outline: none;
 }
}
</style>

在页面中调用:

<template>
  <div class="btn-box">
   <Btn 
    :btnData="{text: '确认注册'}"
    <!--这里就要挂载$emit调用的事件 @confirm="想要调用事件的名字"-->
    @confirm="confirm"
    ref="btn"
   ></Btn>
  </div> 
</template>
<script>
import Btn from '@/components/button'
export default {
 components: {
  Btn
 },
 methods: {
  confirm(){
   if(!this.companyName){
    this.$toast("公司名不能为空") 
    this.$refs.btn.cancel()
   }
 }
}
</script>

在这里,要注意一些细节:

1. button组件形成之后和其它div元素的间距,如果是在组件内定死是很难复用的。

2. 在复用的时候,在父组件中是改变不了子组件的样式的,如果要强制更改,单独写一个并去掉scoped。

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

Javascript 相关文章推荐
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
Mar 25 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
jQuery实现ajax无刷新分页页码控件
Feb 28 Javascript
javascript闭包功能与用法实例分析
Apr 06 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
vue-cli脚手架-bulid下的配置文件
Mar 27 #Javascript
vue2中使用less简易教程
Mar 27 #Javascript
浅谈Vue内置component组件的应用场景
Mar 27 #Javascript
js中apply和Math.max()函数的问题及区别介绍
Mar 27 #Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 #Javascript
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 #Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 27 #Javascript
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
java判断三位数的实例讲解
2019/06/10 Python
详解python播放音频的三种方法
2019/09/23 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Python实现仿射密码的思路详解
2020/04/23 Python
python如何查看安装了的模块
2020/06/23 Python
用python进行视频剪辑
2020/11/02 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
DIY手工制作经营店创业计划书
2014/02/01 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
英语分层教学实施方案
2014/06/15 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
招标保密承诺书
2015/01/20 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python