vue3+element plus 自定义组件,单列的方块 图形加文字列表

1、我想要实现的效果图,中间的 图形加文字的 方块 列效果就是自定义组件实现的。

2、组件页面的代码:

TypeScript 复制代码
<template>
  <div class="box">
    <div v-for="(item) in data" :key="item.id" class="card">
      <img :src="item?.image || logo" class="card-img" />
      <div class="card-name"><b> {{ item.name }} </b> </div>
      <div class="card-desc">
        <span>规格:&nbsp;{{ item.spec }}   </span> 
        <span>单位:&nbsp;{{ item.unitFkDisplayName }} &nbsp;&nbsp;&nbsp;&nbsp; 成本:&nbsp;{{ item.costPrice }} &nbsp;元</span>
        <span></span>
      </div>
      <div class="card-footer">
        <el-button type="primary" size="small" @click="handleDetail(item)">详情</el-button>
        <el-button type="primary" size="small" @click="handleSelect(item)">选中</el-button>
      </div>
    </div>

  </div>
</template>

<script setup>
import logo from '/@/assets/logo1.png'
import {ref,watch} from 'vue'
const emits = defineEmits(['select','clickDetail'])
const props = defineProps({
  items: {
    type: Object,
    default: ()=> {
      return [];
    }
  }
})
const data= ref([]);
watch(
  () => props.items, (newValue) => {
    data.value = newValue;
  },
  { immediate: true, deep: true }
)

//  选中按钮事件
function handleSelect(row){
  // debugger;
  emits('select',row);  //声明父组件上自定义事件,传递参数给父组件
  // console.log(row);
}

//  详情按钮
function handleDetail(row) {
  console.log(row);
  emits('clickDetail',row);  //声明父组件上自定义事件,传递参数给父组件
}
</script>

<style lang="scss" scoped>
.box {
  box-sizing: border-box;
  background-color: #FFFFFF;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;  //这个使用center属性会导致列表内的内容超出范围时,会在上面被截断。
  align-items: center;
  height: 100%; /* 或者你希望的任何高度 */
  overflow-y:visible; /* 只显示垂直滚动条 */
  overflow-x: hidden; /* 隐藏水平滚动条,如果需要的话 */
}

.card {
  display: flex;
  flex-direction: column;
  justify-content: start;
  align-items: center;
  width: 250px;
  border: 1px solid #868686;
  padding: 4px;
  margin: 4px 0;

  &-img {
    width: 100px;
    height: 100px;
  }

  &-name {
    line-height: 30px;
  }

  &-desc {
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    align-items: center;
    width: 100%;
    line-height: 20px;
  }

  &-footer {
    display: flex;
    flex-direction: row;
    justify-content: space-around;
    align-items: center;
    width: 100%;
  }
}
</style>

3、展现组件的页面中相关代码:

TypeScript 复制代码
<template>

<!--elemet  呈现组件的页面代码中,显示组件的代码,上其他内容都忽略了,-->

<Pane size="20" style="height: 650px; ">
					<ImageTextList ref="ImageTextListRef" :items="centerItems" @select="handleSelect" @clickDetail="handleDetail"	/>
</Pane>

</template>

<script lang="ts" setup="" name="cbbjCostPriceDetail">
//图片文字方块 组件
import ImageTextList from './imageBox.vue';

const ImageTextListRef = ref<InstanceType<typeof ImageTextList>>();

// 中间物料信息列表接受数据的对象,这个对象就要根据自己需要填充一条数据给他。比如我的就是通过左侧树组件点击事件nodeClick 从后端API获取数据填充的
const  centerItems = ref([]);

// 树组件点击
const nodeClick = async (node: any) => {
	state.queryParams.typeId = node.id;
	state.queryParams_detail.typeId = node.id;
	const params = Object.assign(state.queryParams, { page: 1, pageSize: 9999,  descStr: 'desc' });
	const params_detail = Object.assign(state.queryParams_detail, { page: 1, pageSize: 9999,  descStr: 'desc' });
	// debugger;
	const result = await await cbbjMaterialApi.page(params);
	if(result?.data?.result?.items){
        //下面一行这里就是填充自定义组件数据对象的
		centerItems.value = result?.data?.result?.items;
		centerItems.value.forEach(item => {			 
			item.image = window.__env__.VITE_PUBLIC_PATH+"/"+item.image;
		});
	}
	handleQuery();
    await handleQueryApi(params.page, params.order);
};


/**
 * 中间选择事件
 * @param row 
 */
async function  handleSelect(row) {
	console.log('select', row);
	// debugger;
	//你可以根据需要在这里调用组件中的按钮,做你想要实现的事
}
/**
 * 中间详情按钮事件
 * @param row 
 */
 async function  handleDetail(row) {
	console.log('select', row);
	// debugger;
	//你可以根据需要在这里调用组件中的按钮,做你想要实现的事
}


</script>
相关推荐
mldong4 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60615 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角6 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi8 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu10 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss