vue2组件封装和UI组件的二次封装,方法,属性,ref的传递

news/2024/11/8 18:31:12 标签: vue.js, 前端, javascript

封装组件使用v-model 

使用方法props接受value值,当值发生变化的时候再通过this.$emit("input", newValue),则实现了简单组件的v-model封装,如果不使用第三方UI可以接受到的值使用watch或者计算属性保存,然后再通过事件派发自己保存的值

$attrs可以透传组件上的属性,如果使用 props接收了某个属性,则从$attrs移除这个属性

代码:如elInput组件

 保存值写法可使用计算属性也可以使用监听器

javascript"><template>
  <div class="switchWrap">
    <el-input
      ref="refInput"
      v-bind="$attrs"
     :value="internalValue"
      @input="updateValue"
    >
    </el-input>
  </div>
</template>

<script>
export default {
  props: {
    value: [Boolean, String, Number],
  },
  data() {
    return {};
  },
  computed: {
    internalValue() {
      return this.value;
    },
  },
  methods: {
    updateValue(newValue) {
      this.$emit("input", newValue); // 触发内部 input 事件 让父组件可以v-model绑定
    },
  },
  mounted() {},
};


</script>

 不保存值可直接派发值

javascript"><template>
  <div class="switchWrap">
    <el-input
      ref="refInput"
      v-bind="$attrs"
      :value="value"
      @input="updateValue"
    >
    </el-input>
  </div>
</template>

<script>
export default {
  props: {
    value: [Boolean, String, Number],
  },
  data() {
    return {};
  },
  computed: {},
  methods: {
    updateValue(newValue) {
      this.$emit("input", newValue); // 触发内部 input 事件 让父组件可以v-model绑定
    },
  },
  mounted() {},
};


</script>

 使用方法

javascript"> <elInput v-model="value"></elInput >

 UI组件封装方法

 $attrs和$slots可以透传属性和插槽 然后通过解构插槽——>#[插槽名]=value 就可以获取传递的值,再通过遍历组件原型上的方法,然后把原型上的方法放在组件上,就可以使用ref透传

使用计算属性 slotsKeys 和 scopedSlotsKeys

 是为了动态获取父组件传递的具名插槽($slots)和作用域插槽($scopedSlots),

  并根据需要排除掉某些已使用的插槽,以便在渲染时可以有选择地展示插槽内容。

javascript"><template>
  <div class="switchWrap">
    <el-input
      ref="refInput"
      v-bind="$attrs"
      :value="value"
      @input="updateValue"
    >
      <template v-for="slotName in scopedSlots" #[slotName]="scoped">
        <slot :name="slotName" v-bind="scoped"></slot>
      </template>
      <template v-for="slotName of namedSlot" v-slot:[slotName]>
        <slot :name="slotName"></slot>
      </template>
    </el-input>
  </div>
</template>

<script>
export default {
  props: {
    value: [Boolean, String, Number],
  },
  data() {
    return {
      usedSlots: [], // 已使用的插槽
    };
  },
  computed: {
    // 使用计算属性 namedSlot 和 scopedSlots
    //  是为了动态获取父组件传递的具名插槽($slots)和作用域插槽($scopedSlots),
    //  并根据需要排除掉某些已使用的插槽,以便在渲染时可以有选择地展示插槽内容。
    namedSlot() {
      return Object.keys(this.$slots).filter(
        (key) => !this.usedSlots?.includes(key)
      );
    },
    scopedSlots() {
      return Object.keys(this.$scopedSlots).filter(
        (key) => !this.usedSlots?.includes(key)
      );
    },
  },
  methods: {
    updateValue(newValue) {
      this.$emit("input", newValue); // 触发内部 input 事件 让父组件可以v-model绑定
    },
  },
  mounted() {
    for (let key in this.$refs.refInput) {
      if (typeof this.$refs.refInput[key] == "function") {
        this[key] = this.$refs.refInput[key];
      }
    }
  },
};
</script>

 使用方法

javascript">       <inputUi v-model="inputValue" @input="getInfo" ref="refInput">
          <template #prepend>Http://</template>
        </inputUi>


http://www.niftyadmin.cn/n/5744290.html

相关文章

AI 重塑软件开发:流程、优势、挑战与应对

一、流程与模式介绍【传统软件开发 VS AI 参与的软件开发】 传统软件开发流程与模式 传统的软件开发是一个复杂且严谨的过程&#xff0c;通常遵循一系列既定的步骤。 需求分析&#xff1a; 开发团队与客户或相关利益者紧密合作&#xff0c;详细了解软件需要实现的功能、性能要…

面粉直供系统|基于java和小程序的食品面粉直供系统设计与实现(源码+数据库+文档)

面粉直供系统 目录 基于java和小程序的食品面粉直供系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#x…

Docker Compose V2 安装

要安装 docker-compose-plugin&#xff0c;需要确保系统已安装 Docker 引擎&#xff0c;因为 docker-compose-plugin 是 Docker CLI 的插件&#xff08;Docker Compose V2&#xff09;。以下是详细指南&#xff1a; 1. 安装 Docker 引擎&#xff1a; 确保系统上安装了 Docker…

梧桐数据库聚合函数使用举例

在数据分析和数据库管理中&#xff0c;聚合函数是一类非常重要的工具&#xff0c;它们能够对数据集进行计算并返回单个结果。梧桐数据库提供了丰富的聚合函数&#xff0c;这些函数可以帮助我们快速地对数据进行汇总、分析和处理。本文将介绍梧桐数据库中一些常用的聚合函数及其…

数据中异常值的鉴定和处理(1)

数据预处理中最不想碰到但又绕不过的一个问题是异常样品的鉴定和处理。异常样本&#xff0c;也称为离群样本&#xff0c;其定义是与其它样本有显着差异的样本。通常是由实验操作失败、样本受损等不易发现的外部因素引起&#xff0c;比如样本被污染了、细胞死亡了、细胞破损了、…

机器学习与深度学习-1-线性回归从零开始实现

机器学习与深度学习-1-线性回归从零开始实现 1 前言 ​ 内容来源于沐神的《动手学习深度学习》课程&#xff0c;本篇博客对线性回归从零开始实现&#xff08;即不调用封装好的库&#xff0c;如SGD优化器、MSE损失函数等&#xff09;进行重述&#xff0c;并且修改了沐神的课堂…

【bug日志-水】解决本地开发下代理和url同名导致刷新404的问题

bug描述 在本地开发&#xff0c;并且路由是history的模式下&#xff0c;代理和url同名的情况下&#xff0c;刷新会404。 {path: /googleAds,//如果有个代理也叫googleAds&#xff0c;刷新时就会404name: googleAds,icon: sound,routes: [{path: /googleAds/GoogleAdsSettingPag…

MybatisPlus入门(九)MybatisPlus-DML编程控制

增删改 Insert Delete Update 操作中的一些问题。 一、主键生成策略 增加的时候主键生成的问题&#xff0c;不同的环境、不同的场景对应的主键生成策略可能是不一样的&#xff0c;比如日志表、购物订单表、外卖单。 主键生成策略设置方法&#xff1a; 示例代码&#xff1a; p…