vue中v-for和v-if一起使用之使用compute的示例代碼
版本
vue 2.9.6
element-ui: 2.15.6
目標效果
說明
在 vue 2.x 中,在一個元素上同時使用 v-if 和 v-for 時,v-for 會優(yōu)先作用
解決方法
選擇性地渲染列表,例如根據(jù)某個特定屬性(category
)來決定不同展示渲染,使用計算屬性computed使用template
占位,將循環(huán)放在template中,v-if作用于元素,此方法script
中不用定義computed方法,見 http://www.dbjr.com.cn/article/247179.htm
核心代碼片段
# html ... <el-divider content-position="left">奧迪</el-divider> <el-link type="primary" target="_blank" v-for="(item, index) in links0" :key="index" :href="item.url" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > <el-button type="primary">{{item.name}}</el-button> </el-link> ... # script ... computed: { links0: function() { return this.links.filter((item) => { return item.category === 0 }) }, links1: function() { return this.links.filter((item) => { return item.category === 1 }) }, links2: function() { return this.links.filter((item) => { return item.category === 2 }) } },
Car.vue
<template> <div> <el-row> <el-col :span="24"> <el-form :inline="true" class="user-search"> <el-form-item> <el-button size="small" type="primary" icon="el-icon-plus" @click="handleEdit()" plain>添加鏈接</el-button> </el-form-item> </el-form> <div > <el-divider content-position="left">奧迪</el-divider> <el-link type="primary" target="_blank" v-for="(item, index) in links0" :key="index" :href="item.url" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > <el-button type="primary">{{item.name}}</el-button> </el-link> <el-divider content-position="left">奔馳</el-divider> <el-link type="primary" target="_blank" v-for="(item, index) in links1" :key="index" :href="item.url" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > <el-button type="primary">{{item.name}}</el-button> </el-link> <el-divider content-position="left">寶馬</el-divider> <el-link type="primary" target="_blank" v-for="(item, index) in links2" :key="index" :href="item.url" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > <el-button type="primary">{{item.name}}</el-button> </el-link> </div> <!-- 添加界面 --> <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog"> <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm"> <el-form-item label="鏈接名稱" prop="name"> <el-input size="small" v-model="editForm.name" auto-complete="off" placeholder="請輸入鏈接名稱"></el-input> </el-form-item> <el-form-item label="鏈接地址" prop="url"> <el-input size="small" v-model="editForm.url" auto-complete="off" placeholder="請輸入鏈接地址"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button size="small" @click="closeDialog">取消</el-button> <el-button size="small" type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button> </div> </el-dialog> </el-col> </el-row> </div> </template> <script> import { getLink, saveLink } from '../../api/userMG' export default { data() { return { links: [], loading: false, //顯示加載 editFormVisible: false, //控制添加頁面顯示與隱藏 title: '添加鏈接', editForm: { name: '', url: '' }, // rules表單驗證 rules: { name: [{ required: true, message: '請輸入鏈接名稱', trigger: 'blur' }], url: [{ required: true, message: '請輸入鏈接地址', trigger: 'blur' }] }, } }, computed: { // 通過根據(jù)category屬性來不同顯示 links0: function() { return this.links.filter((item) => { return item.category === 0 }) }, links1: function() { return this.links.filter((item) => { return item.category === 1 }) }, links2: function() { return this.links.filter((item) => { return item.category === 2 }) } }, created() { // 獲取鏈接 this.getdata() }, // 這下面的方法只有被調(diào)用才會被執(zhí)行 methods: { // 獲取鏈接 getdata() { this.loading = true getLink().then((response) => { this.loading = false console.log(response.data) this.links = response.data }).catch(error => { console.log(error) }) }, // 添加頁面方法 handleEdit: function() { this.editFormVisible = true this.title = '添加鏈接', this.editForm.name = '', this.editForm.url = '' }, // 添加保存頁面方法 submitForm(editData) { this.$refs[editData].validate(valid => { if (valid) { saveLink(this.editForm).then(response => { this.editFormVisible = false this.loading = false // if (response.success) this.getdata() this.$message({ type: 'success', message: '鏈接添加成功' }) }).catch(error => { this.editFormVisible = false this.loading = false // console.log(error.response.data['url'][0]) // console.log(error.response.status) // this.$message.error('鏈接添加失敗,請稍后再試') if (error.response.status == 400 ) { this.$message.error(error.response.data['url'][0]+'如: http://xxx 或 https://xxx') }else { this.$message.error('鏈接添加失敗,請稍后再試') } }) } }) }, // 關(guān)閉添加鏈接窗口 closeDialog() { this.editFormVisible = false } } } </script> <style> /* .el-row { margin-top: 10px; } */ .el-link { margin-right: 5px; } </style>
到此這篇關(guān)于vue中v-for和v-if一起使用之使用compute的文章就介紹到這了,更多相關(guān)vue v-for和v-if一起使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!