【条件渲染】关于在<template>上使用v-if分类的理解

本文介绍了一个使用条件渲染来展示不同人员及其属性的例子。通过简单的模板语法实现针对不同名字的个性化展示。
部署运行你感兴趣的模型镜像
<div v-for="people in arr">
      <template v-if="people.name == '张三'">
            {{people.name}}的有{{people.length}}
      </template>
      <template v-if="people.name == '李四'">
            {{people.name}}有{{people.length}}
      </template>
      <template v-if="people.name == '王五'">
            {{people.name}}足有{{people.length}}
      </template>
  </div>
根据条件分别渲染不同条件的数据

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<template> <!-- drawer --> <template v-if="modalConfig?.component === 'drawer'"> <el-drawer v-model="modalVisible" :append-to-body="true" v-bind="modalConfig?.drawer" @close="handleCloseModal" > <!-- 表单 --> <el-form ref="formRef" label-width="auto" v-bind="modalConfig?.form" :model="formData" :rules="formRules" :disabled="modalConfig?.formDisabled" > <el-row :gutter="20"> <template v-for="item in formItems" :key="item.prop"> <el-col v-show="!item.hidden" v-bind="item.col"> <el-form-item :label="item.label" :prop="item.prop"> <!-- Label --> <template v-if="item.tips" #label> <span> {{ item.label }} <el-tooltip placement="bottom" effect="light" :content="item.tips + ''" :raw-content="true" > <el-icon style="vertical-align: -0.15em" size="16"> <QuestionFilled /> </el-icon> </el-tooltip> </span> </template> <!-- Input 输入框 --> <template v-if="item.type === 'input' || item.type === undefined"> <el-input v-model="formData[item.prop]" v-bind="item.attrs" /> </template> <!-- Select 选择器 --> <template v-else-if="item.type === 'select'"> <el-select v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-option v-bind="option" /> </template> </el-select> </template> <!-- Radio 单选框 --> <template v-else-if="item.type === 'radio'"> <el-radio-group v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-radio v-bind="option" /> </template> </el-radio-group> </template> <!-- switch 开关 --> <template v-else-if="item.type === 'switch'"> <el-switch v-model="formData[item.prop]" inline-prompt v-bind="item.attrs" /> </template> <!-- Checkbox 多选框 --> <template v-else-if="item.type === 'checkbox'"> <el-checkbox-group v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-checkbox v-bind="option" /> </template> </el-checkbox-group> </template> <!-- Input Number 数字输入框 --> <template v-else-if="item.type === 'input-number'"> <el-input-number v-model="formData[item.prop]" v-bind="item.attrs" /> </template> <!-- TreeSelect 树形选择 --> <template v-else-if="item.type === 'tree-select'"> <FkSelectTree v-model="formData[item.prop]" v-bind="item.attrs" :multiple="item.attrs?.multiple" /> </template> <!-- DatePicker 日期选择器 --> <template v-else-if="item.type === 'date-picker'"> <el-date-picker v-model="formData[item.prop]" v-bind="item.attrs" /> </template> <!-- Text 文本 --> <template v-else-if="item.type === 'text'"> <el-text v-bind="item.attrs"> {{ formData[item.prop] }} </el-text> </template> <!-- 格式化代码集 --> <template v-else-if="item.type === 'sys-code'"> <FkSysCode v-model="formData[item.prop]" :sysCode="item.sysCodeSetCode" v-bind="item.attrs" /> </template> <!-- 自定义 --> <template v-else-if="item.type === 'custom'"> <slot :name="item.slotName ?? item.prop" :prop="item.prop" :form-data="formData" :attrs="item.attrs" /> </template> </el-form-item> </el-col> </template> </el-row> </el-form> <!-- 弹窗底部操作按钮 --> <template #footer> <div v-if="!formDisable"> <el-button type="primary" @click="handleSubmit">确 定1</el-button> <el-button @click="handleClose">取 消</el-button> </div> <div v-else> <el-button @click="handleClose">关闭</el-button> </div> </template> </el-drawer> </template> <!-- dialog --> <template v-else> <el-dialog v-model="modalVisible" :align-center="true" :append-to-body="true" width="70vw" v-bind="modalConfig?.dialog" style="padding-right: 0" @close="handleCloseModal" > <!-- 滚动 --> <el-scrollbar max-height="60vh"> <!-- 表单 --> <el-form ref="formRef" label-width="auto" v-bind="modalConfig.form" style="padding-right: var(--el-dialog-padding-primary)" :model="formData" :rules="formRules" > <el-row :gutter="20"> <template v-for="item in formItems" :key="item.prop"> <el-col v-show="!item.hidden" v-bind="item.col"> <el-form-item :label="item.label" :prop="item.prop"> <!-- Label --> <template v-if="item.tips" #label> <span> {{ item.label }} <el-tooltip placement="bottom" effect="light" :content="item.tips + ''" :raw-content="true" > <el-icon style="vertical-align: -0.15em" size="16"> <QuestionFilled /> </el-icon> </el-tooltip> </span> </template> <!-- Input 输入框 --> <template v-if="item.type === 'input' || item.type === undefined"> <el-input v-model="formData[item.prop]" v-bind="item.attrs" clearable /> </template> <!-- Select 选择器 --> <template v-else-if="item.type === 'select'"> <el-select v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-option v-bind="option" /> </template> </el-select> </template> <!-- Radio 单选框 --> <template v-else-if="item.type === 'radio'"> <el-radio-group v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-radio v-bind="option" /> </template> </el-radio-group> </template> <!-- switch 开关 --> <template v-else-if="item.type === 'switch'"> <el-switch v-model="formData[item.prop]" inline-prompt v-bind="item.attrs" /> </template> <!-- Checkbox 多选框 --> <template v-else-if="item.type === 'checkbox'"> <el-checkbox-group v-model="formData[item.prop]" v-bind="item.attrs"> <template v-for="option in item.options" :key="option.value"> <el-checkbox v-bind="option" /> </template> </el-checkbox-group> </template> <!-- Input Number 数字输入框 --> <template v-else-if="item.type === 'input-number'"> <el-input-number v-model="formData[item.prop]" v-bind="item.attrs" /> </template> <!-- TreeSelect 树形选择 --> <template v-else-if="item.type === 'tree-select'"> <FkSelectTree v-model="formData[item.prop]" v-bind="item.attrs" :multiple="item.attrs?.multiple" /> </template> <!-- DatePicker 日期选择器 --> <template v-else-if="item.type === 'date-picker'"> <el-date-picker v-model="formData[item.prop]" v-bind="item.attrs" /> </template> <!-- Text 文本 --> <template v-else-if="item.type === 'text'"> <el-text v-bind="item.attrs"> {{ formData[item.prop] }} </el-text> </template> <!-- 格式化代码集 --> <template v-else-if="item.type === 'sys-code'"> <FkSysCode v-model="formData[item.prop]" :sys-code="item.sysCodeSetCode" v-bind="item.attrs" /> </template> <!-- 自定义 --> <template v-else-if="item.type === 'custom'"> <slot :name="item.slotName ?? item.prop" :prop="item.prop" :form-data="formData" :attrs="item.attrs" /> </template> </el-form-item> </el-col> </template> </el-row> </el-form> </el-scrollbar> <!-- 弹窗底部操作按钮 --> <template #footer> <div style="padding-right: var(--el-dialog-padding-primary)"> <el-button type="primary" @click="handleSubmit">确 定</el-button> <el-button @click="handleClose">取 消</el-button> </div> </template> </el-dialog> </template> </template> <script setup lang="ts"> import { useThrottleFn } from "@vueuse/core"; import type { FormInstance, FormRules } from "element-plus"; import { nextTick, reactive, ref, watch, watchEffect } from "vue"; import type { IModalConfig, IObject, IContentConfig } from "./types"; // 定义接收的属性 const props = defineProps<{ modalConfig: IModalConfig; contentConfig?: IContentConfig; }>(); // 自定义事件 const emit = defineEmits<{ submitClick: []; }>(); const pk = props.modalConfig?.pk ?? "id"; const modalVisible = ref(false); const formRef = ref<FormInstance>(); let formItems = reactive(props.modalConfig.formItems); let formItemChanges = ref<Record<string, any>>({}); const formData = reactive<IObject>({}); const formRules = ref<FormRules>({}); const formDisable = ref(false); const prepareFuncs = []; for (const item of formItems) { item.initFn && item.initFn(item); formData[item.prop] = item.initialValue ?? ""; formRules.value[item.prop] = item.rules ?? []; if (item.watch !== undefined) { prepareFuncs.push(() => { watch( () => formData[item.prop], (newValue, oldValue) => { item.watch && item.watch(newValue, oldValue, formData, formItems); } ); }); } if (item.computed !== undefined) { prepareFuncs.push(() => { watchEffect(() => { item.computed && (formData[item.prop] = item.computed(formData)); }); }); } if (item.watchEffect !== undefined) { prepareFuncs.push(() => { watchEffect(() => { item.watchEffect && item.watchEffect(formData); }); }); } if (item.change) { formItemChanges.value[item.prop] = item.change; } } prepareFuncs.forEach((func) => func()); // 获取表单数据 function getFormData(key?: string) { return key === undefined ? formData : (formData[key] ?? undefined); } // 设置表单值 function setFormData(data: IObject) { for (const key in formData) { if (Object.prototype.hasOwnProperty.call(formData, key) && key in data) { formData[key] = data[key]; formRef.value?.clearValidate(); } } if (Object.prototype.hasOwnProperty.call(data, pk)) { formData[pk] = data[pk]; formRef.value?.clearValidate(); } } // 设置表单项值 function setFormItemData(key: string, value: any) { formData[key] = value; formRef.value?.clearValidate(); } // 显示modal function setModalVisible(data: IObject = {}) { modalVisible.value = true; // nextTick解决赋值后重置表单无效问题 nextTick(() => { Object.values(data).length > 0 && setFormData(data); }); formRef.value?.clearValidate(); } // 表单提交 const handleSubmit = useThrottleFn(() => { formRef.value?.validate((valid: boolean) => { if (valid) { if (typeof props.modalConfig.beforeSubmit === "function") { props.modalConfig.beforeSubmit(formData); } if ( props.contentConfig && props.contentConfig.lefftTree && props.contentConfig.lefftTree.treeKeyName ) { formData[props.contentConfig.lefftTree.treeKeyName] = props.contentConfig?.lefftTree.treeKeyValue; } if (!props.modalConfig.formAction) { ElMessage.error("表单提交未配置"); return; } props.modalConfig.formAction(formData).then(() => { let msg = "操作成功"; if (props.modalConfig.component === "drawer") { if (props.modalConfig.drawer?.title) { msg = `${props.modalConfig.drawer?.title}成功`; } } else { if (props.modalConfig.dialog?.title) { msg = `${props.modalConfig.dialog?.title}成功`; } } ElMessage.success(msg); handleClose(); emit("submitClick"); }); } }); }, 3000); // 取消弹窗 function handleClose() { console.log("取消弹窗"); handleCloseModal(); } // 关闭弹窗 function handleCloseModal() { modalVisible.value = false; handleDrawerClose(); formRef.value?.resetFields(); formRef.value?.clearValidate(); } // 禁用表单--用于详情时候用 function handleDisabled(disable: boolean) { formRef.value?.clearValidate; formDisable.value = disable; props.modalConfig.formDisabled = disable; } // 初始化监听 let formWatcher: () => void; const setupFormWatcher = () => { // 监听指定字段变化 formWatcher = watch( () => props.modalConfig.formItems .filter((formItem) => formItemChanges.value[formItem.prop]) .map((formItem) => ({ prop: formItem.prop, value: formData[formItem.prop], })), (fields) => { fields.forEach((field) => { if (!formItemChanges.value[field.prop]) return; console.log("字段变化:", field.prop, field.value); const changeConfig = formItemChanges.value[field.prop]; if (changeConfig.hidden) { const hiddenStates = changeConfig.hidden(formData); props.modalConfig.formItems.forEach((formItem) => { if (hiddenStates[formItem.prop] !== undefined) { formItem.hidden = hiddenStates[formItem.prop]; formRules.value[formItem.prop] = formItem.hidden ? [] : formItem.rules || []; } }); } }); formRef.value?.clearValidate(); }, { deep: true, immediate: true } ); }; watch( () => modalVisible.value, (newModalVisible) => { if (newModalVisible) { setupFormWatcher(); } else { handleDrawerClose(); } } ); // 弹窗关闭处理 const handleDrawerClose = () => { if (formWatcher) { formWatcher(); // 调用停止监听函数 } }; // 组件卸载时确保停止监听 onUnmounted(() => { handleDrawerClose(); }); // 暴露的属性和方法 defineExpose({ setModalVisible, getFormData, setFormData, setFormItemData, handleDisabled }); </script> <style lang="scss" scoped></style> 优化,弹窗关闭后取消监听,表单校验逻辑
07-17
<el-card class="card"> <el-row class="order-status" :gutter="20"> <el-col :span="1"> <img src="@/assets/images/order.png" style="vertical-align: middle;"> </el-col> <el-col :span="5"> <span style="font-size: 20px;font-weight:700;">{{ $t('order.orderDetail.orderId') }}:{{ order.orderId }}</span> </el-col> <el-col :span="4"> <span v-if="order.orderStatus == 10 || order.orderStatus == 15 || order.orderStatus == 17 || order.orderStatus == 19 || order.orderStatus == -1" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: #919191;padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> <span v-if="order.orderStatus == 20" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: #FFA500;padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> <span v-if="order.orderStatus == 26 || order.orderStatus == 27 || order.orderStatus == 31" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: #FFA500;padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> <span v-if="order.orderStatus == 30" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: rgb(64, 158, 255);padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> <span v-if="order.orderStatus == 0" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: #ff0000;padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> <span v-if="order.orderStatus == 50 || order.orderStatus == 40" style="font-size: 20px;"> {{ $t('order.orderDetail.status') }}: <span style="font-size: 20px;color: #55ff7f;padding-left: 5%">{{ formatOrderStatus(order.orderStatus, $t) }}</span> </span> </el-col> <el-col v-show="order.orderStatus !== 25 && order.orderStatus !== 21 && order.orderStatus !== 22 && order.orderStatus !== 40 && order.orderStatus !== 17" :span="6" class="status"> <span v-if="order.orderStatus == 10">{{ $t('order.orderDetail.waitPayInfo') }}</span> <span v-if="order.orderStatus == 20 || order.orderStatus == 26 || order.orderStatus == 27">{{ $t('order.orderDetail.waitDelInfo') }}</span> <span v-if="order.orderStatus == 30">{{ $t('order.orderDetail.alDelInfo') }}</span> <span v-if="order.orderStatus == 31">{{ $t('order.orderDetail.noPickReturn') }}</span> <span v-if="order.orderStatus == 50 || order.orderStatus == 40">{{ $t('order.orderDetail.alFinishInfo') }}</span> <span v-if="order.orderStatus == 0">{{ $t('order.orderDetail.cancelInfo') }}</span> </el-col> </el-row> <div class="table-detail" style="margin-top:20px ;"> <el-table ref="multipleTable" :data="goodsInfo" tooltip-effect="dark" style="width: 100%;border-top: 1px solid #EBEEF5;" row-key="id" border default-expand-all :tree-props="{children: 'packGoodsInfo', hasChildren: 'hasChildren'}" :header-cell-style="{background:'#fafafa',color:'#606266'}"> <el-table-column :label="$t('orderTable.orderDetail.goodsName')" width="350px"> <template #default="scope"> <el-tag v-if="scope.row.extraActStatus && scope.row.extraActStatus == 1" type="danger"> {{ $t('extraPrice.extraPriceGoods') }} </el-tag> <el-tag v-if="scope.row.type == 'proGift' || scope.row.type == 'h5Gift'" type="danger">{{ $t('button.addGift') }}</el-tag> <el-tag v-if="scope.row.type == 'combinSuit'" type="danger">{{ scope.row.combinSuitName }}</el-tag> <div>{{ scope.row.goods_name }}</div> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.goodsImage')" align="center"> <template #default="scope"> <img v-if="scope.row.type == 'h5Gift'" :src="scope.row.goods_main_photo" style="height: 80px"> <img v-else-if="scope.row.type == 'proGift'" :src="imageUrl + scope.row.goods_mainphoto_path" style="height: 80px"> <img v-else :src="scope.row.fullPath" style="height: 80px"> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.price')" align="center"> <template #default="scope"> <p>{{ moneyUnit }}{{ scope.row.goods_price }}</p> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.specVal')" align="center"> <template #default="scope"> <!-- 组合配件 --> <div v-if="scope.row.type == 'combinSuit'"> <span v-html="scope.row.goods_gsp_val" /> </div> <div v-else> <div v-if="scope.row.spec && scope.row.spec !== null && scope.row.spec.length > 0"> <div v-for="spec in scope.row.spec" :key="spec.goods_gsp_ids"> <span v-html="spec.goods_gsp_val" /> <span>x {{ spec.goods_count }}</span> </div> </div> <span v-else v-html="scope.row.goods_gsp_val" /> </div> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.count')" align="center"> <template #default="scope"> <span v-if="scope.row.type == 'h5Gift'">{{ scope.row.give_count * scope.row.goods_count }}</span> <span v-else>{{ scope.row.goods_count }}</span> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.allPrice')" align="center"> <template #default="scope"> <span v-if="scope.row.goods_all_price">{{ moneyUnit }}{{ scope.row.goods_all_price }}</span> <span v-else>-</span> </template> </el-table-column> <el-table-column :label="$t('orderTable.orderDetail.payoffPrice')" align="center"> <template #default="scope"> <span v-if="scope.row.goods_all_price">{{ moneyUnit }}{{ scope.row.goods_all_price }}</span> <span v-else>-</span> </template> </el-table-column> </el-table> <!-- 入会礼品 期礼 季礼--> <MemberCardGift v-if="order.orderMemberCardGiftInfoDtoList && order.orderMemberCardGiftInfoDtoList.length > 0" :order-member-card-gift-info-dto-list="order.orderMemberCardGiftInfoDtoList" /> <!-- 早鸟礼 --> <div v-if="order.earlyBirdsJson && order.earlyBirdsJson.length > 0 && order.earlyBirdsJson !== null && order.earlyBirdsJson !== undefined"> <birds :early-birds-json="order.earlyBirdsJson" /> </div> <div style="float: left;margin: 20px 0 20px 55px"> <span>{{ $t('orderTable.refundOrderDetail.total') }}:{{ moneyUnit }}{{ order.payAmount }}</span> <span>{{ $t('orderTable.orderDetail.freight') }}:{{ moneyUnit }}{{ order.shipPrice }}</span> <!-- 优惠券 --> <span v-if="order.couponDiscountAmount"> {{ $t('orderTable.orderDetail.coupon') }}: <span style="font-size: 12px; color: red;">{{ '-' + moneyUnit }}{{ order.couponDiscountAmount }}</span> </span> <!-- 会员折扣,是全站的 --> <span v-if="memberAct && memberAct.type == 'allStore'" class="order-price-red"> <span style="font-size: 12px; color: red;">{{ $t('orderTable.refundOrderDetail.memberSave') }}:{{ '-' + moneyUnit }}{{ order.member_activity_amount }}</span> </span> </div> <div v-if="goodsInfoAdd && goodsInfoAdd.length > 0"> <!-- 加购订单 --> <ExtraOrder :orderId="orderAdd.orderId" :extraGoodsInfo="goodsInfoAdd" /> <!-- 金额 --> <div style="float: left;margin: 20px 0 20px 55px"> <span>{{ $t('orderTable.refundOrderDetail.total') }}:{{ moneyUnit }}{{ orderAdd.payAmount }}</span> <span>{{ $t('orderTable.orderDetail.freight') }}:{{ moneyUnit }}{{ orderAdd.shipPrice }}</span> <!-- 优惠券 --> <span v-if="orderAdd.couponDiscountAmount"> {{ $t('orderTable.orderDetail.coupon') }}: <span style="font-size: 12px; color: red;">{{ '-' + moneyUnit }}{{ orderAdd.couponDiscountAmount }}</span> </span> <!-- 会员折扣,不是全站的 --> <span v-if="memberAct && memberAct.type != 'allStore'"> {{ $t('orderTable.orderDetail.memberDiscount') }}:{{ moneyUnit }}{{ orderAdd.discount_price }} </span> <!-- 会员折扣,是全站的 --> <span v-if="memberAct && memberAct.type == 'allStore'" class="order-price-red"> <span style="font-size: 12px; color: red;">{{ $t('orderTable.refundOrderDetail.memberSave') }}:{{ '-' + moneyUnit }}{{ orderAdd.member_activity_amount }}</span> </span> </div> <div style="margin: 20px 0 20px 55px;clear: both;"> <span>{{ $t('orderTable.orderDetail.payPrice') }}:{{ moneyUnit }}{{ order.payAmount }}</span> </div> </div> </div> </el-card>将这个代码优化写法
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值