Vue插槽实现商品列表-编辑渲染

news2024/12/23 9:21:07

商品列表


文章目录

  • 商品列表
      • 核心步骤
      • 创建组件
    • 1. MyTag组件详细步骤
      • 双击显示,自动聚焦
      • 失去焦点,隐藏输入框
      • 回显标签信息
      • 回车修修改内容,同时隐藏输入框
    • MyTable组件详细步骤
      • 1-动态的设置整个表格的数据 : props
      • 2-实现自定义结构-插槽
          • 1-表头自定义
          • 2-主体定制
    • 完整代码
          • App.vue组件
          • MyTab.vue组件
          • MyTable组件
    • 最终效果图:

在这里插入图片描述

核心步骤

MyTag 组件的封装

  1. 创建组件 → 初始化

  2. 实现功能

    (1)双击显示,并开启自动聚焦

​ 1. v-if v-else @dblclick

​ 2. 通过注册全局的自定义指令获取焦点 focus

(2)失去焦点的时候,隐藏输入框

​ 1. 然后使用@blur失去焦点隐藏

(3)回显标签信息

  1. 回显的标签信息是父组件传递过来的

      2. 使用 v-model 实现功能(简化代码)
      3. v-model ===> :value  和 @input
    

    (4)内容修改了,回车 → 修改标签信息

​ 1. @keyup.enter ,触发了回车事件 执行 $emit(‘input’,e.target.value)

​ 2. 然后父组件中的 v-model 底层的 @input自动帮我们执行数据渲染回显


My-Table 表格组件的封装

  1. 数据不能写死,需要动态的传递表格渲染数据

​ 使用: props

  1. 结构不能写死 → 多处结构实现自定义 → 具名插槽

    (1) 表头需要支持自定义

    (2) 主体支持自定义


创建组件

  1. 创建组件 → 初始化

在这里插入图片描述

1.导入
import MyTag from './components/MyTag.vue'
import MyTable from './components./Mytable.vue'

2. 注册
components: {
    MyTag,
    MyTable
}

3. 使用
<MyTag></MyTag>
<MyTable></MyTable>

1. MyTag组件详细步骤

双击显示,自动聚焦

1.双击显示

1.双击显示   
<div v-else @dblclick="handleedit" class="text">{{ value }}</div>

//提供以下方法
    handleedit() {
      // 双击切换到显示状态
      this.isShow = true;
    },

2 自动聚焦

2.自动聚焦
// 封装全局自定义指令(实现获取焦点),当然可以使用$nextTick解决同步Vue的问题,达到异步更新效果
Vue.directive('focus', {
  // el 是我们指令所在的dom元素
  inserted (el) {
    el.focus()
  }
})

在这里插入图片描述


失去焦点,隐藏输入框

  1. 失去焦点,隐藏输入框

    使用blur事件失去焦点,然后将isShow改为false
    @blur="isShow = false"
    

回显标签信息

在我们双击了触发了编辑功能后,显示了输入框,然后再自动获得focus。

  • 现在我们需要回显了
  1. 使用v-model将父组件的值传递过来

  2. 然后子组件使用 props 接受 进行操作

  3. 给组件绑定 v-model 指令

    <MyTag v-model="item.tag"></MyTag>
    
  4. props接收数据,并回显渲染

    1. props接收数据
      // 接收父组件传过来的数据  :value
      props: {
        value: String,
      },
      
     2. 回显渲染
       //将数据动态的赋值给我们的需要显示的标签
       :value="value"
    

    回车修修改内容,同时隐藏输入框

    1. 绑定回车事件 @keyup.enter=“方法名”
    @keyup.enter="handleEnter"
    
    1. 提供对应方法: handleEnter()
    1. 通过$emit('事件名',传递的值) 通知父组件
    methods: {
        handleEnter (e) {
           //子传父,将获取到的输入框给父组件,通知他修改渲染标签
            if (e.target.value.trim() === '') {
                alert('修改的内容不能为空')
                return 
                //通过 input事件 同志父组件监听,并修改输入框内容
                this.$emit('input',e.target.value)
            }
        }
    }
    2. 回车后,输入框隐藏
    this.isShow = false
    

    到此,我们的编辑功能组件实现完毕


MyTable组件详细步骤

1-动态的设置整个表格的数据 : props

  1. 数据在App.vue中,使用父传子实现

    1. 动态的属性传递数据
    <MyTable :data="item.goods"></MyTable>
    
    
    2. 接收数据
    props: {
        data: {
            type: Array,
            required: true  控制判断
        }
    }
    

2-实现自定义结构-插槽

  1. 表头自定义
  2. 主体自定义
  • 目的是为了,我们能够灵活的实现结构和数据对应

  • 记得在相应的组件中使用 : 占好位置
1-表头自定义
1.表头自定义:切记使用具名插槽,因为我们需要在定制的时候,用到相互之间的数据。    
<!-- 使用插槽动态的定制了表头结构 -->
      <template #head>
        <th>编号</th>
        <th>名称</th>
        <th>图片</th>
        <th width="100px">标签</th>
      </template>


在这里插入图片描述

2-主体定制
2. 主体定制:同样的使用具名插槽,需要制定并且传递该组件的数据   
<!-- 使用插槽作用域传递值,定制主体的内容 -->
      <template #body="{ item, index }">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>
          <img :src="item.picture" />
        </td>
        <td>
          <MyTag v-model="item.tag"></MyTag>
        </td>
      </template>

在这里插入图片描述

编辑渲染功能和自定义结构功能就实现完毕了


完整代码

App.vue组件
<template>
  <div class="table-case">
    <MyTable :data="goods">
      <!-- 使用插槽动态的定制了表头结构 -->
      <template #head>
        <th>编号</th>
        <th>名称</th>
        <th>图片</th>
        <th width="100px">标签</th>
      </template>

      <!-- 使用插槽作用域传递值,定制主体的内容 -->
      <template #body="{ item, index }">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>
          <img :src="item.picture" />
        </td>
        <td>
          <MyTag v-model="item.tag"></MyTag>
        </td>
      </template>
    </MyTable>
  </div>
</template>

--------------------------------------------------------
<script>
export default{
import MyTag from './components/MyTag.vue'
import MyTable from "./components/MyTable.vue";
export default {
  // 2.注册组件
  components: {
    MyTag,
    MyTable,
  },
  name: "TableCase",
  data() {
    return {
      tempText: "水杯",
      tempText2: "钢笔",
      goods: [
        {
          id: 101,
          picture:
            "https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg",
          name: "梨皮朱泥三绝清代小品壶经典款紫砂壶",
          tag: "茶具",
        },
        {
          id: 102,
          picture:
            "https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg",
          name: "全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌",
          tag: "男鞋",
        },
        {
          id: 103,
          picture:
            "https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png",
          name: "毛茸茸小熊出没,儿童羊羔绒背心73-90cm",
          tag: "儿童服饰",
        },
        {
          id: 104,
          picture:
            "https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg",
          name: "基础百搭,儿童套头针织毛衣1-9岁",
          tag: "儿童服饰",
        },
      ],
    };
  },
};
</script>


MyTab.vue组件
<template>
  <div class="my-tag">
    <input
      v-if="isShow"
      v-focus
      @blur="isShow = false"
      :value="value"
      @keyup.enter="handleEnter"
      class="input"
      type="text"
      placeholder="输入标签"
    />
    <div v-else @dblclick="handleedit" class="text">{{ value }}</div>
  </div>
</template>


---------------------------------------------------
        
        
 <script>
export default {
  // 接收父组件传过来的数据  :value
  props: {
    value: String,
  },
  data() {
    return {
      isShow: false,
    };
  },
  methods: {
    handleedit() {
      // 双击切换到显示状态
      this.isShow = true
    },
    handleEnter(e) {
      // 子传父,将{输入框的内容}传递给我们的父组件,通知他叫他渲染
      //   由于父组件是  v-model  所以触发事件为  @input
      if (e.target.value.trim() === "") return alert("修改内容不能为空")
        this.$emit("input", e.target.value)
        //   回车后输入框隐藏
        this.isShow = false
    },
  },
};
</script>


MyTable组件
<template>
  <table class="my-table">
    <thead>
      <tr>
        <slot name="head"></slot>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(item,index) in data" :key="item.id">
        <slot name="body" :item = item :index = index></slot>
      </tr>

    </tbody>
  </table>
</template>


----------------------------------------------------


<script>
export default {
  props: {
    data: {
      type: Array,
      required: true
    }
  }
}
</script>

最终效果图:

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞致云及其旗下1Panel进入2023年第二季度最具成长性开源初创榜单

近日&#xff0c;知名风险投资机构Runa Capital发布了2023年第二季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。在这份名…

六款热门项目协作软件详解:解析项目管理利器

项目协作已经成为了企业、组织以及个人工作中不可或缺的一部分。通过使用项目协作软件&#xff0c;团队成员可以更加高效地协同工作&#xff0c;提高工作效率和质量。本文将介绍项目协作软件的功能和种类&#xff0c;帮助读者更好地了解这一领域的发展和应用。 "项目协作软…

自行研发与使用第三方向量数据库的优劣分析

目录 一、自行研发向量数据库的优势 然而,自行研发向量数据库也存在一些明显的劣势: 二、使用第三方向量数据库的优势 然而,使用第三方向量数据库也存在一些劣势: 三、对于大多数企业而言,使用第三方向量数据库更具优势 在现代科技领域,向量数据库是处理大量数据的关…

18V降压5V芯片

航誉微高效率同步降压芯片。输出电流可以高达2A。采用两种工作模式&#xff1a;PWM与PFM切换工作。92%的占空比实现了低压操作并延长了便携系统的电池使用寿命&#xff1b;输出电压可调&#xff1b;振荡频率为 600KHz&#xff08;典型值&#xff09;。内部同步开关提高了效率并…

windows安装Scala

Windows安装Scala 下载地址&#xff1a;https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.zip 解压完成之后 配置环境变量

记一次PlanUML时序图学习

记一次PlanUML时序图学习 前言插件效果代码及其属性解析解析actorparticipantqueueskinparam sequenceMessageAlign centerautonumber-->xnote overalt 总结 前言 最近因为工作需要学习了使用PlanUML画时序图&#xff0c;上一次学这个还是在大学的时候&#xff0c;以为这辈…

如何在Linux系统中安装openresty

1.下载对应的文件&#xff1a;OpenResty - Download 2.将文件上传到需要安装的服务上&#xff0c;我上传的目录是/opt 3.通过命令进行文件的解压缩&#xff1a;tar -xvf openresty-VERSION.tar.gz 4.进入解压后的目录中 cd openresty-1.21.4.2 5.配置设置安装路径./configur…

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…

3DS Max中绘制圆锥箭头

3DS Max中绘制圆锥箭头 绘制结果绘制过程步骤一&#xff1a;绘制立体圆锥方法1方法2 步骤二&#xff1a;圆锥体调参&#xff08;模型尺寸设置&#xff09;1圆锥体参数说明2圆锥体参数调整 步骤三&#xff1a;绘制圆柱体步骤四&#xff1a;圆柱体调参步骤五&#xff1a;圆锥与圆…

安达发|富士康科技集团利用自动排程APS软件打造智慧工厂

富士康科技集团作为全球领先的3C产品研发制造企业&#xff0c;近年来积极布局智能制造领域&#xff0c;通过引入先进的自动化排程系统(APS),成功打造了智慧工厂&#xff0c;提高了生产质量与效率&#xff0c;降低了生产成本。 富士康集团自2019年下半年提出在观澜厂区建立数字可…

dji所有机型,价格,发布日期,最大飞行时间

机型价格发布日期最大飞行时间DJI Mini 3 Pro9999 元2023 年 1 月 20 日30 分钟DJI Air 36988 元2022 年 6 月 29 日46 分钟DJI Air 2S9988 元2021 年 7 月 25 日31 分钟DJI Mavic 313999 元2021 年 11 月 5 日46 分钟DJI Mavic 3 Cine16999 元2021 年 11 月 5 日46 分钟DJI Ma…

【算法与数据结构】513、LeetCode找树左下角的值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题用层序遍历来做比较简单&#xff0c;最底层最左边节点就是层序遍历当中最底层元素容器的第一个值…

【网络安全带你练爬虫-100练】第17练:分割字符串

目录 一、目标1&#xff1a;使用函数分割 二、目标2&#xff1a;使用函数模块 三、目标3&#xff1a;使用正则匹配 一、目标1&#xff1a;使用函数分割 目标&#xff1a;x.x.x.x[中国北京 xx云] 方法&#xff1a;split函数replace函数 1、分割&#xff1a;使用split()方法将…

LAMP 配置与应用

LAMP 架构的组成 LAM(M)P&#xff1a; L&#xff1a;linux A&#xff1a;apache (httpd) M&#xff1a;mysql, mariadb P&#xff1a;php, perl, python apache的功能&#xff1a; 第一&#xff1a;处理http的请求、构建响应报文等自身服务&#xff1b; 第二&#xff1a…

android手机销售app(IDEA,SpringBoot,SSM,MySQL)+支付宝支付+全套视频教程

本项目亮点: 支付宝支付 eCharts柱状图图表数据统计 【项目功能介绍】 本系统包含后台管理和前端app双端系统&#xff0c;后台管理的功能包含: 登录, 退出, 修改管理员信息(基本信息与头像),资源管理,角色管理,资源权限分配,字典管理,用户管理,图书管理,订单管理,订单统计; a…

Java BigDecimal详解

目录 一、前言 二、BigDecimal 2.1、常用构造方法 2.2、常用方法 2.3、示例代码 add(BigDecimal)方法 subtract(BigDecimal)方法 multiply(BigDecimal)方法 divide(BigDecimal)方法 max(BigDecimal val)方法 2.4、BigDecimal的八种舍入模式 setScale(1) setScale(…

CAN接口:Ubuntu系统下CAN接口使用python调用过程

CAN接口&#xff1a;Ubuntu系统下CAN接口使用python调用过程 介绍在Ubuntu系统中通过python程序使用CAN接口。 1. 使用平台 NVIDIA小型边缘设备NX&#xff0c;&#xff08;Orin NX和Xavier NX都可以&#xff09;&#xff0c;系统采用Ubuntu&#xff0c;&#xff08;18.04版本…

ASSY 11994R13PLC模块

可编程性&#xff1a; PLC模块可以通过编程进行定制&#xff0c;以执行特定的控制逻辑和功能。这种可编程性使其非常灵活&#xff0c;可以适应各种应用。 输入/输出&#xff08;I/O&#xff09;&#xff1a; PLC模块通常具有数字输入和输出&#xff0c;以接收和发送信号。某些…

喜报|星瑞格荣获“2022-2023年度国产数据库应用优秀解决方案”奖项

近日&#xff0c;赛迪网为表彰数字赛道上的先行者&#xff0c;联合《数字经济》杂志社和北京科创互联&#xff0c;共同组织以“树立行业标杆&#xff0c;引领服务创新”为中心的“2022-2023年度产业数字服务案例及创新成果征集活动”。该活动旨在鼓励各行业数字化应用技术创新树…

【ag-grid-vue】列定义(Updating Column Definitions)

列定义一节解释了如何配置列。可以在初始设置列之后更改列的配置。本节介绍如何更新列定义。 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列。当设置新列时&#xff0c;网格将与当前列进行比较&#xff0c;并计算出哪些列是旧的(要删除)、哪些列是新的(创建…