久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

第四節:Vue3 開發WordPress設置選項 - 添加圖片上傳功能

本節實現了從本地上傳圖片至WordPress媒體庫和從媒體庫中選擇圖片的功能,并進一步探究了后續文章發展節奏

承接上文,在常用選項中,圖片上傳和選擇功能用的較多,本節來實現這一功能,我們著重討論功能實現,更多美化樣式以及優化性能問題,可自行探索。此處為了便于大家理解,代碼言簡意賅。

預覽

需求如下

  • 提供一個圖片上傳按鈕
  • 可展示選中的圖片
  • 提供清空圖片按鈕

流程如下

第四節:Vue3 開發WordPress設置選項 - 添加圖片上傳功能

效果如下

第四節:Vue3 開發WordPress設置選項 - 添加圖片上傳功能

修改 index.js

存儲圖片鏈接值

我們添加鍵 dataImage 用于存儲選中圖片的鏈接

 //存儲選項值
    const datas = Vue.reactive({
      dataImage: "",
    });

在獲取選項數據時進行賦值,這里,我修改了原來的函數名為 get_option ,更加簡潔易懂。

//獲取數據
    const get_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/get_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          //省略
          datas.dataImage = data.dataImage;
        })
        .catch((error) => {
          window.alert("連接服務器失敗或后臺讀取出錯!數據讀取失敗");
          console.log(error);
        });
    };

添加圖片上傳功能

我們通過以下兩個函數,實現圖片上傳功能

//上傳圖片
    const upload_img = (file) => {
      const formData = new FormData();
      formData.append("file", file);
      return axios
        .post(dataLocal.route + "wp/v2/media", formData, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "multipart/form-data",
          },
        })
        .then((response) => {
          // 圖片上傳成功后的處理邏輯
          const data = response.data;
          //返回圖片URL
          return data.source_url;
        })
        .catch((error) => {
          console.error(error);
          // 圖片上傳失敗后的處理邏輯
        });
    };

    //處理圖片上傳事件
    const update_img = (event) => {
      const file = event.target.files[0];
      upload_img(file).then((url) => {
        //將拿到的圖片URL傳給圖片變量
        datas.dataImage = url;
      });
    };

添加清空功能

添加以下代碼,實現清空功能

//清空選擇圖片
    const clear_img = () => {
      datas.dataImage = "";
    };

添加展示模版

為了模版可以拿到對應的功能,記得將需要的功能函數返回出來。

return {
      datas,
      siteData,
      update_option,
      update_img,
      clear_img,
    };

模版代碼如下

<input type="file" @change.native="update_img"><br/>
<button type="button" @click="clear_img">清理</button><br/>
<img style="width: 300px;height: auto;"  :src=datas.dataImage v-if =datas.dataImage ><hr/>

此時刷新頁面,嘗試選擇圖片并保存,即可看到我們完成了圖片上傳功能,清理按鈕也能正常工作,記得修改選項后點擊保存按鈕。

選擇媒體庫文件

修改 index.js 文件

流程

  • 創建函數,通過REST API 從WordPress 媒體庫中獲取圖片數據
  • vue將獲取的圖片數據展示在前端,并提供選擇按鈕
  • 選中圖片后,將值傳給選項值
  • 保存

效果

第四節:Vue3 開發WordPress設置選項 - 添加圖片上傳功能

創建變量

我們創建變量用于存儲獲取的圖片信息,為了便于擴展,這里使用reactive

 //存儲獲取的值
    const getData = Vue.reactive({
      //存儲獲取的媒體庫值
      mediaList: [],
    });

添加新選項

    //存儲選項值
    const datas = Vue.reactive({
      //省略
      dataSelectedImage: "",
    });

獲取數據也得加上

//獲取數據
    const get_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/get_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          //省略
          datas.dataSelectedImage = data.dataSelectedImage;
        })
        .catch((error) => {
          window.alert("連接服務器失敗或后臺讀取出錯!數據讀取失敗");
          console.log(error);
        });
    };

獲取媒體庫圖片

通過以下函數獲取圖片信息并存儲信息進鍵 mediaList

//獲取媒體庫圖片
    const getMediaList = () => {
      axios
        .get(dataLocal.route + "wp/v2/media")
        .then((response) => {
          getData.mediaList = response.data;
        })
        .catch((error) => {
          console.error(error);
        });
    };

選擇媒體庫圖片

添加以下代碼進行選擇

 //從媒體庫選中圖片
    const selectImage = (imageUrl) => {
      datas.dataSelectedImage = imageUrl;
    };

添加模版

將模版用的數據進行導出

return {
      datas,
      siteData,
      update_option,
      update_img,
      clear_img,
      selectImage,
      getMediaList,
      getData,
    };

添加模版內容

<button @click="getMediaList">獲取媒體庫圖片</button>
<div style="max-width: 800px;;display: flex; margin: 1em 0;">
      <div v-for="media in getData.mediaList" :key="media.id" style="float: left;">

        <img :src="media.source_url" style="max-width: 150px; height: auto;vertical-align: top; ">
        <button @click="selectImage(media.source_url)">選擇</button>
      </div>
      </div>
      <h2>{{datas.dataSelectedImage ? "已" : "未"}}選擇圖片</h2>
      <img  :src="datas.dataSelectedImage" v-if="datas.dataSelectedImage" style="width: 150px;height: auto;"><hr/>

獲取選項值

在php 中,可通過以下方法獲取選項值

    echo "<br/>";
    echo get_option('dataImage');
    echo "<br/>";
    echo get_option('dataSelectedImage');

改進

上述代碼還有很多改進空間,此處為便于演示以及篇幅原因,僅敘于此。

以下是幾個可以優化的點

  • 選中圖片后無需上傳至WordPress即可預覽,點擊保存按鈕后再上傳圖片,
  • 若圖片選項有值,則使用上傳后的圖片鏈接進行圖片預覽
  • 優化清理按鈕,或做成組件,可復用

本地圖片預覽功能

const datas = Vue.reactive({
      dataImage: "",
    });

const update_img = (event) => {
      const file = event.target.files[0];
      const formData = new FormData();

      //預覽圖片
      datas.dataImage = URL.createObjectURL(file);
}

<input type="file" @change.native="update_img"><br/>
<img style="width: 300px;height: auto;"  :src=datas.dataImage ><hr/>

完整代碼

//vite/dist/index.js
//console.log(dataLocal.route);
//console.log(dataLocal.data.user);
const App = {
  setup() {
    //存儲傳來的值
    const siteData = dataLocal.data;

    //存儲獲取的值
    const getData = Vue.reactive({
      //存儲獲取的媒體庫值
      mediaList: [],
    });

    //存儲選項值
    const datas = Vue.reactive({
      dataOne: "",
      dataTwo: "",
      dataName: [],
      dataImage: "",
      dataSelectedImage: "",
    });

    //獲取數據
    const get_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/get_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          const data = response.data;
          datas.dataOne = data.dataOne;
          datas.dataTwo = data.dataTwo;
          datas.dataName = data.dataName;
          datas.dataImage = data.dataImage;
          datas.dataSelectedImage = data.dataSelectedImage;
        })
        .catch((error) => {
          window.alert("連接服務器失敗或后臺讀取出錯!數據讀取失敗");
          console.log(error);
        });
    };

    //保存數據
    const update_option = () => {
      console.log(datas);
      axios
        .post(dataLocal.route + "pf/v1/update_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
          },
        })
        .then((response) => {
          alert("保存成功");
        })
        .catch((error) => {
          alert("保存失敗");
          console.log(error);
        });
    };

    //上傳圖片
    const upload_img = (file) => {
      const formData = new FormData();
      formData.append("file", file);
      return axios
        .post(dataLocal.route + "wp/v2/media", formData, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "multipart/form-data",
          },
        })
        .then((response) => {
          // 圖片上傳成功后的處理邏輯
          const data = response.data;
          //返回圖片URL
          return data.source_url;
        })
        .catch((error) => {
          console.error(error);
          // 圖片上傳失敗后的處理邏輯
        });
    };

    //處理圖片上傳事件
    const update_img = (event) => {
      const file = event.target.files[0];
      upload_img(file).then((url) => {
        //將拿到的圖片URL傳給圖片變量
        datas.dataImage = url;
      });
    };

    //清空選擇圖片
    const clear_img = () => {
      datas.dataImage = "";
    };

    //獲取媒體庫圖片
    const getMediaList = () => {
      axios
        .get(dataLocal.route + "wp/v2/media")
        .then((response) => {
          getData.mediaList = response.data;
        })
        .catch((error) => {
          console.error(error);
        });
    };

    //從媒體庫選中圖片
    const selectImage = (imageUrl) => {
      datas.dataSelectedImage = imageUrl;
    };

    //頁面初始加載
    Vue.onMounted(() => {
      //獲取選項值
      get_option();
    });

    return {
      datas,
      siteData,
      update_option,
      update_img,
      clear_img,
      selectImage,
      getMediaList,
      getData,
    };
  },
  template: `
  文本框1:<input type="text" v-model="datas.dataOne"><br/>
  文本框2:<input type="text" v-model="datas.dataTwo"><hr/>
  
  用戶選擇:<select v-model="datas.dataName" multiple>
  <option v-for="option in siteData.user" :key="option.id" :value="option.id">
      {{ option.name }}
  </option>
</select>
<p>你選擇了:{{ datas.dataName }}</p><br/>
按住command(control)按鍵即可進行多選<hr/>
<input type="file" @change.native="update_img"><br/>
<button type="button" @click="clear_img">清理</button><br/>
<img style="width: 300px;height: auto;"  :src=datas.dataImage v-if =datas.dataImage ><hr/>

<button @click="getMediaList">獲取媒體庫圖片</button>
<div style="max-width: 800px;;display: flex; margin: 1em 0;">
      <div v-for="media in getData.mediaList" :key="media.id" style="float: left;">
     
        <img :src="media.source_url" style="max-width: 150px; height: auto;vertical-align: top; ">
        <button @click="selectImage(media.source_url)">選擇</button>
      </div>
      </div>
      <h2>{{datas.dataSelectedImage ? "已" : "未"}}選擇圖片</h2>
      <img  :src="datas.dataSelectedImage" v-if="datas.dataSelectedImage" style="width: 150px;height: auto;"><hr/>

    <button class="button button-primary" @click="update_option">保存</button>`,
};

Vue.createApp(App).mount("#vuespa");

總結

本節我們學習了從本地上傳圖片和從媒體庫選擇圖片。

代碼部分比較亂,尤其是模版部分,這些都會在后續的打包中進行解決的。

能堅持到這里,你已經很棒了,相信到這里,你已經掌握了復選框,布爾值,單選框,多選框等內容,我就不再過多贅述了。

下一節,我們將使用Vite對現有 JS 文件進行打包,并使用一些基礎的CSS樣式對現有選項進行外觀美化,并進一步研究數據校驗問題。

給TA贊賞
共{{data.count}}人
人已贊賞
??
Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
?
購物車
優惠劵
搜索
久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

    9000px;">

      亚洲欧洲美洲综合色网| 美国欧美日韩国产在线播放| 麻豆精品在线视频| 91精品久久久久久蜜臀| 日韩电影在线免费观看| 日韩欧美激情一区| 成人免费观看视频| 亚洲最色的网站| 日韩免费观看高清完整版| 懂色av一区二区夜夜嗨| 伊人婷婷欧美激情| 日韩欧美国产午夜精品| 成人一区在线观看| 亚洲欧美成人一区二区三区| 欧美日韩免费高清一区色橹橹| 蜜桃91丨九色丨蝌蚪91桃色| 欧美激情一区二区三区四区| 91国产免费看| 国产成人精品网址| 视频一区二区国产| 欧美国产精品一区| 88在线观看91蜜桃国自产| 国产不卡视频一区二区三区| 亚洲大片精品永久免费| 中文欧美字幕免费| 欧美v日韩v国产v| 色综合色狠狠天天综合色| 久久99国产精品成人| 一区二区三区欧美亚洲| 国产日产欧美一区二区三区| 91精品欧美久久久久久动漫| 91啦中文在线观看| 丁香激情综合国产| 国产一区二区在线电影| 日本中文字幕不卡| 亚洲精品水蜜桃| 久久久久99精品国产片| 91精品欧美一区二区三区综合在| 色综合中文字幕国产| 奇米精品一区二区三区四区 | 综合电影一区二区三区| 日韩欧美国产系列| 91精品国产欧美一区二区成人| 91伊人久久大香线蕉| 不卡的看片网站| 成人小视频在线| 国产91精品久久久久久久网曝门| 久久狠狠亚洲综合| 青青草97国产精品免费观看无弹窗版| 一二三四社区欧美黄| 亚洲最新视频在线播放| 一区二区三区蜜桃| 亚洲一区二区不卡免费| 亚洲国产精品久久艾草纯爱| 亚洲综合色成人| 亚洲国产综合91精品麻豆| 一区二区三区在线免费观看| 亚洲自拍偷拍麻豆| 婷婷激情综合网| 蜜桃视频在线一区| 激情综合亚洲精品| 国产一区二区在线免费观看| 国产成人免费视频精品含羞草妖精 | 欧美一区二区免费观在线| 欧美一区二区三区日韩| 2020国产精品| 国产精品系列在线| 亚洲一区在线视频| 免费看欧美女人艹b| 韩国精品免费视频| 99久久综合国产精品| 欧美无砖专区一中文字| 日韩欧美国产一区二区三区| 久久免费精品国产久精品久久久久| 国产区在线观看成人精品| 亚洲日本成人在线观看| 五月婷婷综合网| 高清久久久久久| 欧美日韩国产一二三| 国产女人水真多18毛片18精品视频 | 99精品视频在线观看免费| 色综合久久88色综合天天免费| 欧美久久一二三四区| 久久中文娱乐网| 亚洲图片欧美视频| 精品一区二区三区在线播放视频 | 国产精品网曝门| 亚洲成人自拍偷拍| 国产在线精品免费| 欧美日韩国产综合一区二区| 欧美成人一区二区三区片免费| 国产精品护士白丝一区av| 日韩av电影免费观看高清完整版| 国产成都精品91一区二区三| 欧美精品视频www在线观看| 中文字幕成人网| 男人的天堂久久精品| 色欧美片视频在线观看在线视频| 欧美大白屁股肥臀xxxxxx| 夜夜嗨av一区二区三区网页| 丁香另类激情小说| 久久奇米777| 蜜桃一区二区三区四区| 欧美色图在线观看| 亚洲色大成网站www久久九九| 国产一区不卡精品| 日韩欧美一级二级三级久久久| 一区二区三区日韩精品视频| caoporn国产一区二区| 精品国一区二区三区| 丝袜美腿亚洲综合| 精品视频在线看| 亚洲自拍欧美精品| 在线观看视频一区二区| 亚洲精品菠萝久久久久久久| 99久久精品情趣| 国产精品久久久久影院色老大| 国产成人免费高清| 久久精品视频在线看| 久久99国产精品尤物| 日韩欧美卡一卡二| 另类小说欧美激情| 亚洲精品一区二区在线观看| 国产一区二区在线观看视频| 精品粉嫩aⅴ一区二区三区四区| 免费视频一区二区| 日韩欧美国产一区二区在线播放| 日韩av二区在线播放| 91.com在线观看| 美日韩黄色大片| 欧美大黄免费观看| 国产专区综合网| 欧美激情一区二区三区全黄| 成人一区在线观看| 亚洲精品成人天堂一二三| 欧美三片在线视频观看| 三级亚洲高清视频| 久久午夜老司机| 国产不卡视频在线播放| 亚洲色图视频网| 欧美视频在线一区二区三区 | 日韩成人av影视| 欧美成人欧美edvon| 国产精品69毛片高清亚洲| 国产精品色在线| 欧美少妇一区二区| 韩国成人在线视频| 亚洲天堂精品视频| 欧美日韩不卡在线| 国产精品一二三| 一区二区三区在线视频免费观看| 91精品在线观看入口| 成人夜色视频网站在线观看| 亚洲韩国一区二区三区| 久久久久久夜精品精品免费| av爱爱亚洲一区| 免费看黄色91| 亚洲黄一区二区三区| 欧美成人精精品一区二区频| 成人一区在线看| 日韩极品在线观看| 最新国产成人在线观看| 欧美一区二区三区免费在线看| 白白色 亚洲乱淫| 丝袜a∨在线一区二区三区不卡| 日本一区二区免费在线| 91麻豆精品国产综合久久久久久| 成人综合婷婷国产精品久久蜜臀| 午夜视频在线观看一区二区三区| 国产精品嫩草久久久久| 欧美精品在线一区二区| 99久久免费国产| 国产精品一区2区| 久久er精品视频| 亚洲成a人v欧美综合天堂下载 | 综合分类小说区另类春色亚洲小说欧美| 欧美三区在线观看| 91天堂素人约啪| 国产成人av电影免费在线观看| 午夜激情久久久| 亚洲综合男人的天堂| 日韩理论片在线| 久久久不卡影院| 欧美一级高清片| 欧美挠脚心视频网站| 欧美又粗又大又爽| a在线欧美一区| av在线不卡免费看| 国产91在线|亚洲| 风流少妇一区二区| 国产精品亚洲第一区在线暖暖韩国 | 日本黄色一区二区| 成人在线视频一区二区| 国产乱子轮精品视频| 极品美女销魂一区二区三区| 久久精品99国产精品日本| 蜜臀99久久精品久久久久久软件| 日韩精品色哟哟| 麻豆成人av在线| 狠狠色丁香久久婷婷综合_中|