iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Vue.js

重新瞭解vue3.js + vite框架系列 第 7

Day7-Vue.js基礎入門:商品後台管理介面(final)

  • 分享至 

  • xImage
  •  

7-1 建立修改按鈕事件觸發,解決顯示資料及修改資料同步修改問題,判斷新增及修改功能觸發

<div id="app">
  <table class="table">
    <thead>
      <tr>
        <th>標題</th>
        <th>圖片</th>
        <th>銷售狀態</th>
        <th>編輯</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in products" :key="item.id"
        :class="{'table-success': item.onStock}">
        <td>{{ item.name }}</td>
        <td>
          <img :src="item.imageUrl" alt="" height="100">
        </td>
        <td>
          <input type="checkbox" v-model="item.onStock">
        </td>
        <td>
          <button type="button" class="btn btn-outline-primary"
           v-on:click="editITem(item)">修改</button>-----------按鈕事件處發,帶入v-for的item資料
        </td>
      </tr>
    </tbody>
  </table>
  <form>
    <div class="mb-3">
      <label for="productName" class="form-label">產品名稱</label>
      <input type="text" id="productName"
        class="form-control"
        v-model="temp.name"
      >
    </div>
    <div class="mb-3">
      <img :src="temp.imageUrl" class="img-fluid d-block" alt="" width="300">
      <label for="productImage"
      class="form-label">產品圖片</label>
      <input type="text" id="productImage"
        class="form-control"
        v-model="temp.imageUrl"
      >
    </div>
    <button type="button"
    class="btn btn-secondary"
    v-on:click="confirmEdit">更新</button>
  </form>
</div>
<script>
const products = [{
  id: '1',
  imageUrl: 'https://images.unsplash.com/photo-1516906571665-49af58989c4e?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=300&q=80',
  name: 'MacBook Pro',
  onStock: false,
}];
const App = {
  data() {
    return {
      products: [],
      temp: {
        name: '',
        imageUrl: ''
      }
    }
  },
  methods: {
    editITem(item1){
      // console.log('editITem',item1);-------------驗證修改按鈕觸發事件
      //this.temp = item1;---------// 只有寫此語法,會導致顯示資料及被修改時同步修改資訊(傳參考問題)
      this.temp = {...item1};----------- //需使用淺層拷貝解決:展開方式
    },
    confirmEdit() {
      // 將新增資料及修改資料功能並存
      // 原始資料products有id,更新資料temp無id
      // 透過id判斷是修改還是新增作業
      if( !this.temp.id ){
        //無id時跑新增資料
        this.temp.id = new Date().getTime();
        this.temp.onStock = false;
        this.products.push(this.temp);
        this.temp = {};
      }else{
        // 有id時跑修改資料
        // 使用forEach是比對原始item的id位置是否相同
        this.products.forEach((item,i)=>{
          if(item.id === this.temp.id){
            this.products[i] = this.temp;
          }
        })
        this.temp={};
      }
    }
  },
  created() {
    this.products = products;
  }
};

Vue.createApp(App).mount('#app');
</script>

https://ithelp.ithome.com.tw/upload/images/20230922/20121669pnooIFEkBO.png
https://ithelp.ithome.com.tw/upload/images/20230922/201216694lUKHHSmjX.png

知識點來源:六角課程、008天絕對看不完的vue3.js、網路文章

以上是今天所提供知識點如有誤,再請務必在下面留言~


上一篇
Day6-Vue.js基礎入門:商品後台管理介面(2)-v-for +傳入外部資料
下一篇
Day8-指令語法v-text
系列文
重新瞭解vue3.js + vite框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言