您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何應用Vue動態表單”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何應用Vue動態表單”吧!
??后臺管理系統里面有非常多的表單需求,我們希望能夠通過寫一個json格式的數據,通過vue的循環動態地去渲染動態表單。并且能夠在外部得到渲染出來的表單數據,從而做一個入庫操作。
??vue-model相當于給表單元素傳遞一個value,外部監聽input事件。所以我們自己封裝表單組件的時候也是可以傳遞一個value值,監聽input事件獲取輸入的值。
<input type="text" v-model="thing"> <!-- 等同于 --> <input type="text" v-bind:value="thing" v-on:input="thing = $event.target.value">
??最近在寫一個在線教育平臺,發現在后臺添加課程的時候,每個課程所需要的參數不一樣(有的課程沒有特殊參數),使用固定表單在這個場景下使用很不優雅,而且工作量巨大。為了解決這個問題,我們可以在添加課程的時候動態的展示出課程分類表單所需要的參數,獲取輸入的課程參數,構造數據,進行入庫操作。
通過組件展示分類
<!-- 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); //動態添加高亮類選擇器 mydiv.classList.add("bg"); } } } </script> <style> ul { padding-left: 10rem; list-style: none; } .bg { background: orange; color: white; } </style>
采用第三方組件監聽分類的ID
<!--bus.js--> import Vue from 'vue' export default new Vue();
課程添加頁面
<template> <div> <heads></heads> <h2>課程提交頁面</h2> <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() { //監聽 bus.$on('msg', target => { console.log(target); this.fid = target; if (this.cid === 0) { this.get_cate(this.fid) } else { this.$toast.fail("您已經保存過課程了,無法再次選擇分類"); return false; } }); }, //聲明變量 data() { return { //數據 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); } }); }, //獲取數據 get_data: function () { //發送請求 this.axios.get( 'http://localhost:5000/catelist/').then((result) => { console.log(result); // 聲明根節點 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>
感謝各位的閱讀,以上就是“如何應用Vue動態表單”的內容了,經過本文的學習后,相信大家對如何應用Vue動態表單這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。