小言_互联网的博客

带学妹理解Vue的子组件封装

232人阅读  评论(0)

我是歌谣 放弃很难 但是坚持一定很酷

前言

本文主要对子组件的封装做一个了解
首先我们直接看一下代码显示 首先是今天有一个学妹
过来问我如何封装子组件

实现效果

首先这个组件是基于eleemnt-ui进行封装的
我们看一眼实现效果


有了实现效果 之后
我们一起来看看他的父子组件

父组件

 <!--增强漏扫(控制台页面)查询页面封装 -->
            <ecloudInputSearch
              class="r"
              placeholder="按服务器名称搜索"
              ref="searchInput"
              @search="searchData"
            ></ecloudInputSearch>

子组件

<!--增强漏扫(控制台页面)查询页面封装 -->
<template>
      <!-- -->
  <div class="ecloud-input-search">
    <!--  封装带有文本框的按钮模式  -->
    <!--   placeholder 按钮的提示文字 -->
    <!--  inputText文本框绑定的值  -->
    <!--  获取焦点进行一个置空操作  -->
    <!--    -->
    <el-input
      :class="['input-content', inputText != '' ? 'input-hover' : '']"
      :placeholder="inputPlaceHolder"
      v-model="inputText"
      @focus="clearPlaceHolder()"
      @blur="setPlaceHolder()"
      @input="changeContent()"
      @keyup.enter.native="searchEnterFun"
    >

      <span slot="suffix" @click="clearText">
        <i class="eicon e-error icon-search"></i>
      </span>
    </el-input>
    <el-button
      class="search-content"
      :class="searchBtn ? 'btnOn' : 'btnOff'"
      icon="eicon e-search"
      @click="searchData"
    ></el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: '',
      searchBtn: false, //判断搜索框是否有输入的状态

      /*按钮框的提示文字*/
      inputPlaceHolder: ''
    }
  },
  props: {
    placeholder: {
      type: String,
      default: '请输入内容'
    }
  },
  watch: {
    inputText: function(newValue, oldValue) {
      this.changeContent()
    }
  },
  created() {
    this.inputPlaceHolder = this.placeholder
  },
  methods: {
    clearText() {
      this.inputText = ''
      this.searchData()
    },
    /*获取焦点就将placehoder置空*/
    clearPlaceHolder() {
      this.inputPlaceHolder = ''
    },
    setPlaceHolder() {
      this.inputPlaceHolder = this.placeholder
    },
    //监听搜索框的输入状态来改变搜索按钮
    changeContent() {
      if (this.inputText != '') {
        this.searchBtn = true
      } else {
        this.searchBtn = false
      }
    },
    searchData() {
      this.$emit('search', this.inputText)

    },
    searchEnterFun(e) {
      var keyCode = window.event ? e.keyCode : e.which
      if (keyCode == 13) {
        this.searchData()
      }
    }
  }
}
</script>

<style lang="scss">
.ecloud-input-search {
  .input-content {
    /*宽度200px*/
    width: 200px;
    /*设置radio样式*/
    .el-input__inner {
      border-radius: 2px 0 0 2px;
      padding: 0 10px;
    }

    .icon-search {
      display: none;
    }
  }
  .input-hover {
    &:hover {
      .icon-search {
        font-size: 15px;
        color: #cccccc;
        display: inline-block;
      }
    }
    .el-input__inner:focus + .el-input__suffix {
      .icon-search {
        display: inline-block;
      }
    }
  }
  .search-content {
    font-size: 14px;
    width: 36px;
    height: 32px;
    border-left: 0;
    padding: 0;
    border-radius: 0 2px 2px 0;
    background: #f5f5f5;
    color: #999999;
    border-color: #d9d9d9;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    vertical-align: top;
  }
  .btnOn {
    background: #337dff;
    color: #ffffff;
    border-color: #337dff;
  }
  .btnOff {
    background: #f5f5f5;
    color: #999999;
    border-color: #d9d9d9;
  }
  .el-input__suffix {
    top: 8px;
    right: 9px;
    cursor: pointer;
  }
  .icon-search {
    font-size: 15px;
    color: #cccccc;
  }
}
</style>

解释

首先父子组件怎么引入就不多说了
直接说主要知识点 从上向下理解

第一行

class修改绑定一个类 一个三元运算符

:class="['input-content', inputText != '' ? 'input-hover' : '']"

绑定的值为不为空的时候绑定hover样式

第二行

inputPlaceHolder是父亲组件的值 直接父子组件传值
值为空的时候


显示名称

第三行

获取焦点的时候把inputPlaceHolder置空

第四行

失去焦点的时候将inputPlaceHolder显示

第五行

输入的时候父子触发显示X号按钮

第六行

按回车的时候进行父子传值
父组件拿到值之后进行搜索

我是歌谣 放弃很容易 但是坚持一定很酷


转载:https://blog.csdn.net/weixin_43392489/article/details/116266691
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场