vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url

当图片字段接口直接返回的是图片url,可以直接放到img标签上

   <img v-if="thumbLoader" class="r-image-loader-thumb" :src="resUrl" />

二、当图片字段接口直接返回的是图片Id

那么就需要去拼一下图片链接

调用下接口吧返回的id传过去拼接即可

<img v-if="thumbLoader" class="r-image-loader-thumb" :src="imgSrc" />

 

const imgSrc = computed(() => {
    
        return `/bnc_rest/market/file/${resUrl};
     
});

三、接口直接返回的是图片文件 

需要自行拼接


------------------------结构部分
<img v-if="thumbLoader" class="r-image-loader-thumb" :src="logo" />

------------------------js部分
import { getEnterpriseLogo } from "@/api/index.js";

const logo = computed(() => {
    let url = "";
    if (props.detail && props.detail.enterpriseVO && 
    props.detail.enterpriseVO.enterpriseId) {
   //在api.js文件里写个方法调用 或者直接拼
      //1.调用的方法
      url = getEnterpriseLogo(props.detail.enterpriseVO.enterpriseId);
      //2.直接在当前页面拼接
      // url = `/bnc_rest/org/orgunits/${props.detail.enterpriseVO.enterpriseId}/logo`;
    }
    return url;
});

api/index.js文件

/**
 * 获取企业logo
 */
export const getEnterpriseLogo = id => {
    return `/bnc_rest/org/orgunits/${id}/logo`;
};

相当于一个预览接口

/**
 * 预览文件
 * @param {string} fileId 文件id
 */
function purview(id) {
    window.open(`/bnc_rest/market/file/${id}`);
}

四、table表格里去放置图片字段

用的ui组件库为arco-deiagn vue 组件库

 <a-table
                column-resizable
                :bordered="{ headerCell: true, wrapper: false }"
                :data="rtableTableData"
                :scrollbar="false"
                :pagination="false"
                :row-selection="rowSelection"
                @row-click="rowClick"
                v-model:selected-keys="selectedKeys"
                :row-key="rowKey"
                v-bind="{ ...OtherProps }"
                :scroll="scrollConfig"
                @select="rowSelect"
                @select-all="rowAllSelect"
                :span-method="spanMethod"
                ref="tableRef"
            >
                <template #summary-cell="{ column, record }">
                    <div>{{ record[column.dataIndex] }}</div>
                </template>
                <template #columns>
                    <a-table-column align="left" title="序号" v-if="showSeq" :width="showSeqWidth" class="first">
                        <template #cell="{ rowIndex }">{{ currentPageStart + rowIndex }}</template>
                    </a-table-column>
                    <a-table-column
                        v-for="(c, i) in columns"
                        :width="c.width ? c.width : i + 1 < columns.length ? 120 : undefined"
                        :align="c.align ? c.align : 'left'"
                        :title="c.title"
                        :data-index="c.dataIndex"
                        :fixed="c.fixed ? c.fixed : ''"
                        :key="i"
                    >
                        
                        <template #cell="{ rowIndex, record, column }">
                            <!-- 自定义单元格内容 -->
                            <slot
                                :name="c.slotName ? c.slotName : c.dataIndex"
                                :rowIndex="rowIndex"
                                :record="record"
                                :cell="record[column.dataIndex]"
                            >
                                <!-- 图片 -->
                                <template v-if="c.type && c.type == 'img'">
                                    <RImage
                                        v-if="record[column.dataIndex]"
                                        fit="cover"
                                        height="32"
                                        width="100%"
                                        :src="record[column.dataIndex]"
                                        show-loader
                                        class="r-table-content-img"
                                    ></RImage>
                                    <span v-else>-</span>
                                </template>
                                <!-- 附件 -->
                                <template v-else-if="c.type && c.type == 'file'">
                                    <RLink v-model="record[column.dataIndex]" v-if="record[column.dataIndex]"></RLink>
                                    <span v-else>-</span>
                                </template>
                                <div v-else>{{ formatterCell(record, c) }}</div>
                            </slot>
                        </template>
                    </a-table-column>
  </a-table>

此处为表格内单元格的图片放置,对其设置一个表格插槽即可

可以使用自定义组件来实现在表格中嵌套输入框和上传图片。 1. 创建自定义组件 在Vue项目中创建一个新的组件,可以命名为“TableInputImage”,并在该组件中定义一个上传图片和输入框。 ``` <template> <div> <input type="text" v-model="inputValue" /> <input type="file" @change="onFileChange" /> <img :src="imageUrl" v-if="imageUrl" /> </div> </template> <script> export default { data() { return { inputValue: '', imageUrl: '', }; }, methods: { onFileChange(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { this.imageUrl = reader.result; }; }, }, }; </script> ``` 2. 在表格中使用自定义组件 在表格中使用自定义组件,可以将“TableInputImage”组件作为表格中的一个列的渲染函数。例如: ``` <template> <div> <el-table :data="tableData"> <el-table-column label="名称" prop="name"></el-table-column> <el-table-column label="图片"> <template slot-scope="scope"> <table-input-image></table-input-image> </template> </el-table-column> </el-table> </div> </template> <script> import TableInputImage from '@/components/TableInputImage'; export default { components: { TableInputImage, }, data() { return { tableData: [ { name: '商品1', image: '' }, { name: '商品2', image: '' }, { name: '商品3', image: '' }, ], }; }, }; </script> ``` 在这个例子中,“TableInputImage”组件被嵌套在“el-table-column”标签中,并且作为一个插槽来渲染。 3. 获取表格中的数据 为了获取表格中的数据,可以在“TableInputImage”组件中触发一个自定义事件,并将输入框和图片的值传递回父组件。例如: ``` <template> <div> <input type="text" v-model="inputValue" @input="onInput" /> <input type="file" @change="onFileChange" /> <img :src="imageUrl" v-if="imageUrl" /> </div> </template> <script> export default { data() { return { inputValue: '', imageUrl: '', }; }, methods: { onInput() { this.$emit('input', { inputValue: this.inputValue, imageUrl: this.imageUrl, }); }, onFileChange(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { this.imageUrl = reader.result; this.onInput(); }; }, }, }; </script> ``` 在这个例子中,当输入框或图片发生变化时,将触发一个“input”事件,并将输入框和图片的值作为一个对象传递回父组件。在父组件中,可以监听这个事件并更新表格中的数据。例如: ``` <template> <div> <el-table :data="tableData"> <el-table-column label="名称" prop="name"></el-table-column> <el-table-column label="图片"> <template slot-scope="scope"> <table-input-image @input="onInput(scope.$index, $event)"></table-input-image> </template> </el-table-column> </el-table> </div> </template> <script> import TableInputImage from '@/components/TableInputImage'; export default { components: { TableInputImage, }, data() { return { tableData: [ { name: '商品1', image: '' }, { name: '商品2', image: '' }, { name: '商品3', image: '' }, ], }; }, methods: { onInput(index, data) { this.tableData[index].inputValue = data.inputValue; this.tableData[index].imageUrl = data.imageUrl; }, }, }; </script> ``` 在这个例子中,“TableInputImage”组件触发了一个“input”事件,并将输入框和图片的值作为一个对象传递回父组件。在父组件中,可以监听这个事件并更新表格中的数据,通过索引来定位到正确的行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值