在vue3.0中封装button使用slot组件

目录
  • 封装button使用slot组件
    • 需求
    • 子组件
    • 父组件引用
  • vue带你封装一个button
    • 创建一个 ShowButton.vue 的组件
    • 新建一个 Button.vue
    • ShowButton.vue 内使用

封装button使用slot组件

需求

同一个button在不同页面使用,只有文字不一样;有的内容为登录有的为注册

下面我们自封一个button组件

子组件

<template>
<!-- :type="type" 为按钮类型 :disabled="disabled" 为判断他为false还是ture  
    {'is-disabled':disabled} 如果为true就可以有is-disabled的样式
    @click="$emit('click')" 传入一个cklick点击事件
-->
    <button 
        class="y-button"    
        :class="{'is-disabled':disabled}"
        :type="type"
        :disabled="disabled"
        @click="$emit('click')"
    >
        <slot>
            <!-- 这是一个插槽在父组件中可以放入登录或都注册的文本字段 -->
        </slot>
    </button>
</template>
<script>
export default {
    name:'ybutton',
    props:{//传值去到父组件 
        type:String,
        disable:{//传值类型,默认值为false
            type:Boolean,
            default:false
        }
    }
}
</script>
<style scoped>
/* 获取焦点的时候和hover的时候改变颜色 */
.is-disabled:focus,
.is-disabled:hover{
    background: blue;
    color:white;
 
}
</style>

父组件引用

<template>
    <div>
        <input type="text" v-model="use.email">
        <div class="btn_wrap">
            <Ybutton :disabled="isDisabled" @click="loginClick">登录</Ybutton>
        </div>
    </div>
</template>
 
<script>
// 引入button组件
import Ybutton from "./Ybutton"
export default {
    data(){
        return{
            user:{
                email:''
            }
        }
    },
    components:{//注册组件
        Ybutton
    },
    computed:{//监听子组件的disabled用于启用或禁用按钮
        isDisabled(){
            if(this.user.email){
                // 如果input框有值就让disabled为false 不禁用
                return false;

            }else{
                return true;
            }
        }

    },
    methods:{
        loginClick(){
            // 实现登录,存储token
            this.$axios.post('/api/users/login',this.user).then(res =>{
                // res 结果用会返回token 我们可以用解构模式给他存储
                const { token } = res.data;
                // 存储ls
                localStorage.setItem('wxToken',token);
                //存储之后页面进行主页跳转
                this.$router.push('/')

            })
        }
    }
}
</script>

vue带你封装一个button

作为一个后端程序员偶尔搞搞前端,对我自己来说是打开新的领域,提高自己的竞争力,说实话搞前端和搞后端的思维方式是完全不同的,注重点也是非常不同的,话说今天宝宝我农历生日哈哈哈哈,开心就写几篇放纵一下。

使用 Vue-cli 创建一个 HelloWorld 项目即可作为起始脚手架。

创建一个 ShowButton.vue 的组件

<template>
  <div>
    <h1>封装一个 button</h1>
    <div v-if="value === 1">
      <button @click="buttonClick()">button1</button>
    </div>
    <div v-else-if="value === 2">
      <button @click="buttonClick()">button2</button>
    </div>
    <div v-else>
      <button @click="buttonClick()">button3</button>
    </div>
  </div>
</template>
<script>
export default {
  name: "ShowButton",
  data() {
    return {
      value: 2
    };
  },
  methods: {
    buttonClick() {
      console.log("value" + this.value);
    }
  }
};
</script>
<style>
</style>

这里用了vue 里的 v-if 表达式做逻辑判断,但是如果有 10 个按钮,那么就需要写 10 个 判断,而且如果该组件还将被别的页面引用到,那就得还得复制一遍。代码一点也不优雅呀。

我们借助于 VUE 给我们提供的 render 函数解决这个问题。

新建一个 Button.vue

<script>
export default {
    props:{
        type:{
            type:String,
            default:'normal'
        },
        text:{
            type:String,
            default:'button'
        }
    },
    render(h){
        /**
         * h 是 createElement 的另一个名称, 接受 2 个参数,具体可看 vue 文档
         * 1 - 元素
         * 2 - 选项
         */
        return h('button',{
            class:{
                btn: true,
                'btn-success': this.type === 'success',
                'btn-danger': this.type === 'danger',
                'btn-warning': this.type === 'warning',
                'btn-normal': this.type === 'normal'
            },
            domProps:{
                innerText: this.text || '默认'
            },
            on:{
                click: this.handleClick
            }
        })
    },
    methods:{
        handleClick(){
            this.$emit('myClick')
        }
    }
}
</script>
<style scoped>
.btn{
    width: 100px;
    height:40px;
    line-height:40px;
    border:0px;
    border-radius:5px;
    color:#ffff;
}
.btn-success{
    background:#2ecc71;
}
.btn-danger{
    background:#e74c3c;
}
.btn-warning{
    background:#f39c12;
}
.btn-normal{
    background:#bdc3c7;
}
</style>

ShowButton.vue 内使用

<template>
  <div>
    <h1>封装一个 button</h1>
    <!-- <div v-if="value === 1">
      <button @click="buttonClick()">button1</button>
    </div>
    <div v-else-if="value === 2">
      <button @click="buttonClick()">button2</button>
    </div>
    <div v-else>
      <button @click="buttonClick()">button3</button>
    </div> -->
     <Button type='success' text='button1' @myClick="buttonClick()"></Button>
  </div>
</template>
<script>
import Button from "./Button.vue";
export default {
  name: "ShowButton",
  data() {
    return {
      value: 2
    };
  },
  components: {
    Button
  },
  methods: {
    buttonClick() {
      console.log("value" + this.value);
    }
  }
};
</script>
<style>
</style>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vuejs第十一篇组件之slot内容分发实例详解

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. Slot分发内容 ①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如代码: <

  • Vue slot插槽的使用详情

    目录 1.为什么使用slot 1.1 slot(插槽) 1.2 组件中的插槽 1.3 例子 2.如何封装这类组件(slot) 3. 插槽的案例 4.插槽默认值 5.具名插槽 6.编译作用域 7.作用域插槽 1.为什么使用slot 1.1 slot(插槽) 在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽 插槽的目的是为了让我们原来的设备具备更多的扩展性 比如电脑的USB我们可以插入U盘,手机,鼠标,键盘等等 1.2 组件中的插槽 组件的插槽也是为了让我们的组件更具有扩展性 让使用者

  • 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)

    写在前面 之前写过一篇关于vue实现dialog会话框组件的文章http://www.jb51.net/article/139218.htm 讲到了如何实现一个vue对话框组件,其中涉及到了父组件和子组件的通信,这个不用多说,看我之前的文章就能明白,文章最后也说到了,我们可以使用slot插槽来编写组件,slot用来分发内容到子组件中,从而实现组件的高度复用,编写的组件更加灵活. 还是结合对话框的例子,使用slot来实现对话框组件 注册一个名叫dialog-tip的全局组件 Vue.compone

  • 在vue3.0中封装button使用slot组件

    目录 封装button使用slot组件 需求 子组件 父组件引用 vue带你封装一个button 创建一个 ShowButton.vue 的组件 新建一个 Button.vue ShowButton.vue 内使用 封装button使用slot组件 需求 同一个button在不同页面使用,只有文字不一样;有的内容为登录有的为注册 下面我们自封一个button组件 子组件 <template> <!-- :type="type" 为按钮类型 :disabled=&quo

  • vue3.0中使用websocket,封装到公共方法的实现

    目录 使用websocket,封装到公共方法 vue中封装websocket问题 1.在untils文件夹下新建socket_service.js 2.在main.js里引用 2.在组件里调用$socket 使用websocket,封装到公共方法 首先创建一个socket.ts文件封装公共方法 /* * @Descripttion: 封装socket方法 * @version: * @Date: 2021-08-06 11:14:39 * @LastEditTime: 2021-10-26 14

  • vue3.0中setup使用(两种用法)

    一.setup函数的特性以及作用 可以确定的是 Vue3.0 是兼容 Vue2.x 版本的 也就是说我们再日常工作中 可以在 Vue3 中使用 Vue2.x 的相关语法 但是当你真正开始使用 Vue3 写项目时 你会发现他比 Vue2.x 方便的多 Vue3 的一大特性函数 ---- setup 1.setup函数是处于 生命周期函数 beforeCreate 和 Created 两个钩子函数之间的函数 也就说在 setup函数中是无法 使用 data 和 methods 中的数据和方法的 2.

  • 如何在vue3.0+中使用tinymce及实现多图上传文件上传公式编辑功能

    相关文档 本文部分内容借鉴: https://www.cnblogs.com/zhongchao666/p/11142537.html tinymce中文文档: http://tinymce.ax-z.cn/ 安装tinymce 1.安装相关依赖 yarn add tinymce || npm install tinymce -S yarn add @tinymce/tinymce-vue || npm install @tinymce/tinymce-vue -S 2.汉化编辑器前往此地址下载

  • vue3.0中的watch侦听器实例详解

    目录 前言 侦听器和计算属性的区别 vue3如何使用watch呢? 基本使用 监听多个响应式数据 侦听reactive定义的响应式数据 监听reactive定义的响应式数据的某一个属性 配置选项用法 总结 前言 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器.这就是为什么 Vue 通过watch选项提供了一个更通用的方法,来响应数据的变化.当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的. 侦听器和计算属性的区别 计算属性里不可以做异步操作,侦听器可以做异步操作

  • vue3.0中setup的两种用法实例

    目录 前言 一.setup函数的特性以及作用 二.setup函数的注意点: 用法1:结合ref使用 用法2:代码分割 总结 前言 这篇文章主要介绍了vue3.0中setup使用,本文通过两种用法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 什么是setup setup是vue3新增的生命周期函数,setup的加入就是为了让vue3使用组合式API(Composition API).使用组合式API更符合大型项目的开发,通过setup可以将该部分抽离成函数,

  • vue3.0中的双向数据绑定方法及优缺点

    熟悉vue的人都知道在vue2.x之前都是使用object.defineProperty来实现双向数据绑定的 而在vue3.0中这个方法被取代了 1. 为什么要替换Object.defineProperty 替换不是因为不好,是因为有更好的方法使用效率更高 Object.defineProperty的缺点: 1. 在Vue中,Object.defineProperty无法监控到数组下标的变化, 导致直接通过数组的下标给数组设置值,不能实时响应. push() pop() shift() unsh

  • Vue3.0中的monorepo管理模式的实现

    前言 前段时间9月21日参加了在成都举办的第五届FEDAY, 印象比较深刻的是白鹭引擎首席架构师@王泽分享的<框架开发中的基础设施搭建>,提到了在下一代白鹭引擎中使用到monorepo模式,以用来管理多个模块,协调各个模块之间的依赖更新. 正好在国庆期间10月5日尤大公开了vue3.0已完成的源码,也是采用了monorepo管理模式,看来monorepo确实有其独到的优势,再加上以前在项目中遇到过相关的痛点,所以深入地了解了一下这种模式,本文将基于vue3.0讨论如何通过monorepo模式来

  • vue3.0中友好使用antdv示例详解

    前言 随着我们vue3.0的出现,我们的ui组件库也有了一些变化,像我们的旧版的element-ui已经不能在vue3.0中使用了,如果要使用element的话需要使用最新版的element-plus,由于发现它并不太好用,因此我选择了Ant Design Vue. 如果我们以前经常使用antd的话,我们使用起来这个上手会非常方便. 在vue3.0中引入我们的antdv 1.首先使用我们的vue/cli创建vue3.0项目并使用less 2. 在vue3.0中使用的话我们需要安装 ant-des

  • vue3.0中使用element的完整步骤

    前言: 在vue3.0中使用element框架,因为element是支持vue2.0的,他推出的支持vue3.0的版本叫 element-plus 官网入口:点我进入 一.个人遇到的问题与解决办法: 遇到的问题: 我直接用cnpm  i element-plus -S 装的版本,不知道为啥,一直报错 图1,版本型号 图2 ,我的代码中使用图3 解决办法: 我把package.json中的element-plus的版本更换成    下面这句话,解决了问题(是否为最新版本问题,还在求证中) "ele

随机推荐