Vue動態(tài)表單的應用詳解
概述
后臺管理系統(tǒng)里面有非常多的表單需求,我們希望能夠通過寫一個json格式的數(shù)據(jù),通過vue的循環(huán)動態(tài)地去渲染動態(tài)表單。并且能夠在外部得到渲染出來的表單數(shù)據(jù),從而做一個入庫操作。
v-model的理解
vue-model相當于給表單元素傳遞一個value,外部監(jiān)聽input事件。所以我們自己封裝表單組件的時候也是可以傳遞一個value值,監(jiān)聽input事件獲取輸入的值。
<input type="text" v-model="thing">
<!-- 等同于 -->
<input type="text" v-bind:value="thing"
v-on:input="thing = $event.target.value">
業(yè)務應用場景
最近在寫一個在線教育平臺,發(fā)現(xiàn)在后臺添加課程的時候,每個課程所需要的參數(shù)不一樣(有的課程沒有特殊參數(shù)),使用固定表單在這個場景下使用很不優(yōu)雅,而且工作量巨大。為了解決這個問題,我們可以在添加課程的時候動態(tài)的展示出課程分類表單所需要的參數(shù),獲取輸入的課程參數(shù),構造數(shù)據(jù),進行入庫操作。
通過組件展示分類
<!-- reply.vue -->
<template>
<div>
<li>
<div v-if="data.id != 0" @click="getfid(data.id)" :id="data.id"> {{ data.name }}</div>
<ul v-if="data.children && data.children.length > 0">
<Reply v-for="child in data.children" :key="child.id" :data="child"/>
</ul>
</li>
</div>
</template>
<script>
import bus from './bus.js';
export default {
//聲明名稱
name: "Reply",
props: ['data'],
//聲明組件
components: {},
//聲明變量
data() {
return {
fid: 0,
}
},
//自定義過濾器
filters: {
myfilter: function (value) {
value = value.slice(0, 3);
return value + "********";
}
},
//初始化方法
mounted() {
},
//聲明方法
methods: {
//點選分類id
getfid: function (fid) {
this.fid = fid;
//console.log(this.fid);
bus.$emit("msg", fid);
localStorage.setItem("fid", this.fid);
//取消所有高亮
var divs = document.getElementsByClassName("bg");
//遍歷選擇器
for (var i = divs.length - 1; i >= 0; i--) {
//取消高亮
divs[i].classList.remove("bg");
}
//首先將當前元素高亮顯示
var mydiv = document.getElementById(fid);
//動態(tài)添加高亮類選擇器
mydiv.classList.add("bg");
}
}
}
</script>
<style>
ul {
padding-left: 10rem;
list-style: none;
}
.bg {
background: orange;
color: white;
}
</style>
采用第三方組件監(jiān)聽分類的ID
<!--bus.js--> import Vue from 'vue' export default new Vue();
課程添加頁面
<template>
<div>
<heads></heads>
<h1>課程提交頁面</h1>
<reply :data="mydata"/>
<van-cell-group>
<van-field label="課程標題" v-model="title"/>
<van-field label="課程描述" v-model="desc" rows="5" type="textarea"/>
<van-field label="課程價格" v-model="price"/>
<div v-for="(value,key,index) in params">
<van-field :label="key" v-model="info[key]"/>
</div>
<van-button color="gray" @click="addcourse">保存課程</van-button>
</van-cell-group>
</div>
</template>
<script>
//導入其他組件
import bus from './bus.js';
import reply from "./reply";
import heads from "./heads";
export default {
//聲明組件
components: {
'reply': reply,
'heads': heads,
},
//構造方法
created() {
//監(jiān)聽
bus.$on('msg', target => {
console.log(target);
this.fid = target;
if (this.cid === 0) {
this.get_cate(this.fid)
} else {
this.$toast.fail("您已經(jīng)保存過課程了,無法再次選擇分類");
return false;
}
});
},
//聲明變量
data() {
return {
//數(shù)據(jù)
mydata: {},
//課程分類id
fid: localStorage.getItem("fid"),
title: "",
price: "",
desc: "",
cid: 0,
videos: [],
videosrc: "",
params: {},
info: {}
}
},
//初始化方法
mounted() {
this.get_data();
},
//聲明方法
methods: {
get_cate(fid) {
this.axios.get('http://localhost:5000/getcate/', {params: {'fid': fid}}).then(result => {
var myparams = result.data.params;
if (myparams === '') {
myparams = null
}
myparams = JSON.parse(myparams)
this.params = myparams
for (var key in this.params) {
this.$set(this.info, key, '')
}
console.log(this.info)
})
},
//添加課程
addcourse: function () {
var lists = [];
for (var key in this.info) {
lists.push({'key': key, 'value': this.info[key], 'label': this.params[key]})
}
var list_str = JSON.stringify(lists)
var data_post = {
fid: this.fid,
title: this.title,
desc: this.desc,
price: this.price,
id: localStorage.getItem("user_id"),
}
if (lists.length > 0) {
data_post = {
fid: this.fid,
title: this.title,
desc: this.desc,
price: this.price,
id: localStorage.getItem("user_id"),
params:list_str
}
}
this.axios.post(
'http://localhost:5000/addcourse/',
this.qs.stringify(data_post)).then((result) => {
if (result.data.code === 200) {
this.$toast.success('課程添加成功');
this.cid = result.data.cid;
} else {
this.$toast.fail(result.data.msg);
}
});
},
//獲取數(shù)據(jù)
get_data: function () {
//發(fā)送請求
this.axios.get(
'http://localhost:5000/catelist/').then((result) => {
console.log(result);
// 聲明根節(jié)點
var mytree = {'id': 0, name: ""};
mytree['children'] = result.data;
this.mydata = mytree;
console.log(this.mydata);
});
}
}
}
</script>
<style scoped>
ul {
padding-left: 10rem;
list-style: none;
}
</style>
小結
簡單的來說,就是我們在添加課程的時候選擇分類,會以表單的形式動態(tài)展示出該分類下面我們必傳的參數(shù),用戶添加課程,提高效率。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- vue 動態(tài)表單開發(fā)方法案例詳解
- 使用Vue生成動態(tài)表單
- 策略模式實現(xiàn) Vue 動態(tài)表單驗證的方法
- 詳解Vue+Element的動態(tài)表單,動態(tài)表格(后端發(fā)送配置,前端動態(tài)生成)
- 基于Vue+elementUI實現(xiàn)動態(tài)表單的校驗功能(根據(jù)條件動態(tài)切換校驗格式)
- vue構建動態(tài)表單的方法示例
- vue2 中如何實現(xiàn)動態(tài)表單增刪改查實例
- Vue+ElementUI實現(xiàn)表單動態(tài)渲染、可視化配置的方法
- Vue+Element實現(xiàn)動態(tài)生成新表單并添加驗證功能
- vue+element實現(xiàn)動態(tài)加載表單
相關文章
Vue?報錯-4058?ENOENT:no?such?file?or?directory的原因及解決方法
Vue?報錯-4058?ENOENT:?no?such?file?or?directory的原因和解決辦法,關于為什么為會報這個錯誤,按照字面意思的理解就是沒有找到這個文件或這個路徑,說明是路徑不對,本文給大家分享解決方案,感興趣的朋友一起看看吧2023-10-10
Vue 實現(xiàn)CLI 3.0 + momentjs + lodash打包時優(yōu)化
今天小編就為大家分享一篇Vue 實現(xiàn)CLI 3.0 + momentjs + lodash打包時優(yōu)化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
vue.js中proxyTable 轉發(fā)請求的實現(xiàn)方法
今天小編就為大家分享一篇vue.js中proxyTable 轉發(fā)請求的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
詳解在vue-cli3.0中自定css、js和圖片的打包路徑
這篇文章主要介紹了詳解在vue-cli3.0中自定css、js和圖片的打包路徑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
elementui 開始結束時間可以選擇同一天不同時間段的實現(xiàn)代碼
這篇文章主要介紹了elementui 開始結束時間可以選擇同一天不同時間段的實現(xiàn)代碼,需要先在main.js中導入相應代碼,代碼簡單易懂,需要的朋友可以參考下2024-02-02

