<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
整體和使用者列表 類似 功能步驟有:
不一樣的點:之前編輯資訊 新增資訊是 彈出對話方塊編輯 但商品資訊內容較多 我們跳轉到一個元件、並且進行商品編輯的時候要進行路由傳參 來渲染初始資料
點選新增商品按鈕時跳轉到新增商品元件對應路徑:
addGoods(){ this.$router.push('/goods/add') }
點選編輯商品按鈕時跳轉到編輯商品元件對應路徑 並且傳入id
ToEditGoods(id){ this.$router.push(`/goods/edit/${id}`) }
新增商品和編輯商品元件佈局一致只是新增商品 不用 傳參請求資料
我們以編輯商品為例
在設定路由對應關係的時候 預留預留位置
{ path:'/goods', component:GoodsList }, { path:'/goods/add', component:GoodsAdd }, { path:'/goods/edit/:id', component:GoodsEdit }
第一步 先使用元件進行頁面佈局:
主要使用到了 el-steps 步驟條元件 和 el-tabs 分頁元件的聯動 使他們步長一致 使用共同的
active 步驟條的active 動態繫結 到 activeIndex上
當分頁發生切換時 根據name 賦值給 activeIndex
async handleClick(){ this.activeIndex = this.activeName * 1 // 選擇了商品(動態)引數選項 },
這樣 兩個元件就可以聯動展示了
分頁元件其實是包裹在 el-form 當中方便統一提交給伺服器
接下來就是表單內部 元件渲染 表單驗證了
元件渲染el-input 資料繫結 v-model 型別限制 tpye=‘number’ prop合法值驗證
這裡需要自定義驗證的是 商品價格不能小於0 商品數量必須是整數
必填就可以直接使用自帶的
基本資訊中還有一個要點:分類選擇
<el-form-item label="選擇商品分類"> el-cascader 級聯選擇器 <el-cascader 預設選定的值是根據id請求過來的分類陣列 v-model="AddGoodsForm.goods_cat" style="width: 400px" 資料來源:cateLists 一進入頁面請求過來的 :options="cateLists" 有清空按鈕 clearable 禁用 編輯頁面 不讓修改分類 disabled 級聯選擇器的相關規則 :props="CSet" 選擇發生改變時 執行的回撥 @change="handleChange"></el-cascader> </el-form-item> <script> 資料來源: async getAllCate(){ const {data:res} = await this.$http.get('categories') if (res.meta.status !==200) return this.$Msg.error('獲取商品分類列表失敗!') this.cateLists = res.data } 級聯選擇器的規則 CSet:{ 展示下一級觸發方式 滑鼠懸浮 expandTrigger: 'hover', 指定選項的子選項為選項物件的某個屬性值 children:'children', 顯示的文字 label:'cat_name', 文字對應的value value:'cat_id', } 選擇發生改變時 執行的回撥 只讓選擇第三級 不是的話就清空 選擇不進去 handleChange(){ if (this.AddGoodsForm.goods_cat.length !== 3){ this.AddGoodsForm.goods_cat = [] } console.log(this.AddGoodsForm.goods_cat) } <script>
如果是新增商品頁面的話 也大體一致 把 disabled 去掉即可
並且在切換分頁時可以驗證AddGoodsForm.goods_cat 的長度
leaveTabs(activeName, oldActiveName){ if(oldActiveName === '0' && this.AddGoodsForm.goods_cat.length !== 3){ this.$Msg.error('請先選擇商品分類!') return false }
根據伺服器返回的資料
渲染商品引數-attr.many 和商品屬性-attr.only
分別渲染 多選框組和輸入框組來v-for 迴圈
<el-tab-pane label="4.商品圖片" name="3"> <el-upload class="upload-demo" :action="actionToUrl" :on-preview="handlePreview2" :on-remove="handleRemove" :on-success="handleSuccess" :headers="UploadHeaders" list-type="picture-card"> <el-button size="small" type="primary">點選上傳</el-button> <div slot="tip" class="el-upload__tip">只能上傳jpg/png檔案,且不超過500kb</div> </el-upload> </el-tab-pane> <el-dialog title="預覽圖片" :visible.sync="Preview" width="45%"> <img :src="PreviewPic" alt="" style="width: 100%"> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="Preview = false">確 定</el-button> </span> </el-dialog> <script> action 必選引數,上傳的地址 這裡用的是本地伺服器 actionToUrl:'http://127.0.0.1:8888/api/private/v1/upload' on-preview 點選檔案列表中已上傳的檔案時的勾點 點選出現對話方塊顯示放大預覽圖 handlePreview2(file){ this.PreviewPic=file.response.data.url // 顯示圖片的地址 this.Preview = true // 決定對話方塊顯示的布林值 } on-remove 檔案列表移除檔案時的勾點 handleRemove(file){ //1.獲取將要刪除的圖片臨時路徑 const fileUrl = file.response.data.tmp_path //2.從pics 陣列中,找到這個圖片對應的索引值 let aaa = this.AddGoodsForm.pics.findIndex(value => value === fileUrl) console.log(aaa) //3.呼叫陣列 splice 方法 把圖片資訊物件從pics 陣列中移除 this.AddGoodsForm.pics.splice(aaa,1) console.log(this.AddGoodsForm.pics) } on-success 檔案上傳成功時的勾點 async handleSuccess(response){ // 找出定義一下 新上傳檔案的路徑地址 const NewPicUrl = response.data.tmp_path // push 到預留表單位中 this.AddGoodsForm.pics.push(NewPicUrl) console.log(this.AddGoodsForm.pics) // const {data:res} = await this.$http.put(`goods/${this.NowEditId}/pics`,this.AddGoodsForm.pics) // if (res.meta.status !==200) return this.$Msg.error('更新主圖失敗!') // this.$Msg.success('更新主圖成功!') } headers 設定上傳的請求頭部 UploadHeaders:{ Authorization:window.sessionStorage.getItem('token') }, </script>
先執行安裝語句:
在main.js 中註冊 並引入樣式
npm install vue-quill-editor import VueQuillEditor from 'vue-quill-editor' import 'quill/dist/quill.core.css' // import styles import 'quill/dist/quill.snow.css' // for snow theme import 'quill/dist/quill.bubble.css' // for bubble theme Vue.use(VueQuillEditor, /* { default global options } */)
在元件中使用
<el-tab-pane label="5.商品內容" name="4"> <quill-editor ref="myQuillEditor" 資料雙向繫結 便於傳送請求 v-model="AddGoodsForm.goods_introduce" 富文字編輯器的核心設定 :options="editorOption" /> </el-tab-pane> <script> // 此處定義在data外 const toolbarOptions = [ ['insertMetric'], ['bold', 'italic', 'underline', 'strike'], // 加粗,斜體,下劃線,刪除線 ['blockquote', 'code-block'], //參照,程式碼塊 [{ 'header': 1 }, { 'header': 2 }], // 幾級標題 [{ 'list': 'ordered' }, { 'list': 'bullet' }], // 有序列表,無序列表 [{ 'script': 'sub' }, { 'script': 'super' }], // 下角標,上角標 [{ 'indent': '-1' }, { 'indent': '+1' }], // 縮排 [{ 'direction': 'rtl' }], // 文字輸入方向 [{ 'size': ['small', false, 'large', 'huge'] }], // 字型大小 [{ 'header': [1, 2, 3, 4, 5, 6, false] }], // 標題 [{ 'color': [] }, { 'background': [] }], // 顏色選擇 [{ 'font': ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong', 'Arial'] }], // 字型 [{ 'align': [] }], // 居中 ['clean'], // 清除樣式, ['link', 'image'] // 上傳圖片、上傳視訊 ] // toolbar標題 const titleConfig = [ { Choice: '.ql-insertMetric', title: '跳轉設定' }, { Choice: '.ql-bold', title: '加粗' }, { Choice: '.ql-italic', title: '斜體' }, { Choice: '.ql-underline', title: '下劃線' }, { Choice: '.ql-header', title: '段落格式' }, { Choice: '.ql-strike', title: '刪除線' }, { Choice: '.ql-blockquote', title: '塊參照' }, { Choice: '.ql-code', title: '插入程式碼' }, { Choice: '.ql-code-block', title: '插入程式碼段' }, { Choice: '.ql-font', title: '字型' }, { Choice: '.ql-size', title: '字型大小' }, { Choice: '.ql-list[value="ordered"]', title: '編號列表' }, { Choice: '.ql-list[value="bullet"]', title: '專案列表' }, { Choice: '.ql-direction', title: '文字方向' }, { Choice: '.ql-header[value="1"]', title: 'h1' }, { Choice: '.ql-header[value="2"]', title: 'h2' }, { Choice: '.ql-align', title: '對齊方式' }, { Choice: '.ql-color', title: '字型顏色' }, { Choice: '.ql-background', title: '背景顏色' }, { Choice: '.ql-image', title: '影象' }, { Choice: '.ql-video', title: '視訊' }, { Choice: '.ql-link', title: '新增連結' }, { Choice: '.ql-formula', title: '插入公式' }, { Choice: '.ql-clean', title: '清除字型格式' }, { Choice: '.ql-script[value="sub"]', title: '下標' }, { Choice: '.ql-script[value="super"]', title: '上標' }, { Choice: '.ql-indent[value="-1"]', title: '向左縮排' }, { Choice: '.ql-indent[value="+1"]', title: '向右縮排' }, { Choice: '.ql-header .ql-picker-label', title: '標題大小' }, { Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '標題一' }, { Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '標題二' }, { Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '標題三' }, { Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '標題四' }, { Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '標題五' }, { Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '標題六' }, { Choice: '.ql-header .ql-picker-item:last-child', title: '標準' }, { Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小號' }, { Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大號' }, { Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大號' }, { Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '標準' }, { Choice: '.ql-align .ql-picker-item:first-child', title: '居左對齊' }, { Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中對齊' }, { Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右對齊' }, { Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '兩端對齊' } ] // 此處書寫在data當中 editorOption: { placeholder: '請在這裡輸入......', theme: 'snow', //主題 snow/bubble modules: { history: { delay: 1000, maxStack: 50, userOnly: false }, toolbar: { container: toolbarOptions, handlers: { insertMetric: this.showHandle } } } } // 此處書寫在 methods 中 // 設定富文字編輯器 initTitle () { document.getElementsByClassName('ql-editor')[0].dataset.placeholder = '' for (let item of titleConfig) { let tip = document.querySelector('.quill-editor ' + item.Choice) if (!tip) continue tip.setAttribute('title', item.title) } }, showHandle () { this.$Msg.error('這是自定義工具列的方法!') }, // 自定義按鈕內容初始化 initButton () { const editorButton = document.querySelector('.ql-insertMetric') editorButton.innerHTML = '<i class="el-icon-link" style="font-size: 18px;color:black"></i>' }, // 失去焦點 onEditorBlur (editor) { }, // 獲得焦點 onEditorFocus (editor) { }, // 開始 onEditorReady (editor) { }, // 值發生變化 onEditorChange (editor) { // 如果需要手動控制資料同步,父元件需要顯式地處理changed事件 // this.content = editor.html; console.log(editor); }, </script>
<el-tab-pane label="6.提交商品" name="5"> <el-empty image="http://www.wsg3096.com/gangback/pub/asdc1.png" :image-size="320" description="確定所有資料新增完畢後就可以提交啦!"> <el-button type="primary" icon="el-icon-success" @click="ToGoods">上傳商品</el-button> </el-empty> </el-tab-pane> <script> // 確定上傳的按鈕 async ToGoods(){ this.$refs.AddGoodsFormRef.validate(async valid =>{ if (!valid) return this.$Msg.error('請檢查下各項資料是否規範!') // 執行新增業務的邏輯 先深拷貝一下 防止改變 級聯選擇器 const form = _.cloneDeep(this.AddGoodsForm) // 處理當前商品所屬ID 伺服器要求 ,分割的字串 form.goods_cat = form.goods_cat.join(',') // 請求過來的資料儲存到ManyData OnlyData 展示 返回去的時候 還用伺服器的資料就行 form.attrs = [...this.ManyData,...this.OnlyData] // console.log(form) const {data : res} = await this.$http.put(`goods/${this.NowEditId}`,form) if (res.meta.status !== 200) return this.$Msg.error('編輯商品失敗!') this.$Msg.success('編輯商品成功!') await this.$router.push('/goods') }) } </script>
到此這篇關於Vue element商品列表的增刪改功能實現的文章就介紹到這了,更多相關Vue element商品列表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45