首頁 > 軟體

Vue element商品列表的增刪改功能實現

2022-08-30 14:00:34

介紹 

整體和使用者列表 類似 功能步驟有:

  • 麵包屑導航
  • 外部是大的卡片元件
  • 搜尋商品 新增商品
  • 表格渲染資料
  • 作用域插槽用於 操作按鈕
  • 分頁器元件的使用

不一樣的點:之前編輯資訊 新增資訊是 彈出對話方塊編輯 但商品資訊內容較多 我們跳轉到一個元件、並且進行商品編輯的時候要進行路由傳參 來渲染初始資料

點選新增商品按鈕時跳轉到新增商品元件對應路徑:

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>

商品資訊vue富文字編輯器的設定

先執行安裝語句:

在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!


IT145.com E-mail:sddin#qq.com