久久精品国产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;">

      久久综合999| 欧美日韩国产高清一区二区三区 | 蜜桃av一区二区| 亚洲精品少妇30p| 欧美精品一区二区三区久久久| 欧美精品久久天天躁| 91九色最新地址| 91老司机福利 在线| 91婷婷韩国欧美一区二区| 99久久99久久久精品齐齐| 岛国精品在线播放| 91毛片在线观看| 欧美最猛黑人xxxxx猛交| 91国偷自产一区二区开放时间 | 国产盗摄一区二区| 国产精品1区2区| 成人app软件下载大全免费| 成人激情图片网| 91在线观看一区二区| 91国模大尺度私拍在线视频| 精品视频在线看| 欧美一区二区黄| 久久精品视频免费| 亚洲欧美在线视频| 亚洲精品国产无天堂网2021| 午夜精品福利久久久| 狠狠色丁香久久婷婷综合丁香| 国产成人综合自拍| 91成人国产精品| 91精品黄色片免费大全| 久久一区二区三区国产精品| 国产精品久久免费看| 一区二区视频免费在线观看| 麻豆精品视频在线| av资源网一区| 欧美一区二区福利视频| 国产精品萝li| 午夜视黄欧洲亚洲| 不卡av电影在线播放| 8x福利精品第一导航| 国产欧美精品一区二区色综合朱莉 | 蜜桃精品视频在线观看| 成人av在线电影| 欧美一区二区三区精品| 亚洲男人的天堂在线观看| 激情av综合网| 欧美日韩三级一区| 国产欧美一区二区精品仙草咪 | 日本视频一区二区三区| 成人黄色小视频| 69p69国产精品| 自拍偷拍国产亚洲| 狠狠色综合播放一区二区| 色偷偷一区二区三区| 久久亚洲精精品中文字幕早川悠里| 综合久久久久久| 久久精品久久久精品美女| 欧美色图第一页| 国产精品乱码一区二区三区软件 | 丝袜亚洲另类欧美综合| 99久久精品免费看国产| 日韩一区二区三| 中文字幕欧美国产| 三级欧美在线一区| 在线一区二区三区做爰视频网站| 老汉av免费一区二区三区| 国产精品萝li| 亚洲人成人一区二区在线观看| 丝袜诱惑亚洲看片| 色婷婷综合在线| 久久九九影视网| 麻豆成人91精品二区三区| 欧美性色欧美a在线播放| 亚洲欧洲av色图| 99久久精品国产导航| 日本一区二区三区四区在线视频| 国内精品久久久久影院色| 日韩一区二区三区视频| 亚洲色图制服丝袜| 成a人片亚洲日本久久| 国产亚洲污的网站| 成人一区二区三区在线观看| 国产日韩综合av| 国产麻豆视频一区二区| 久久久777精品电影网影网 | 欧美中文字幕一区二区三区亚洲| 中文字幕免费观看一区| 国产河南妇女毛片精品久久久| 久久婷婷色综合| 国产成人8x视频一区二区| 国产欧美一区二区精品性| 9色porny自拍视频一区二区| 亚洲特级片在线| 欧美亚洲动漫另类| 日韩电影一区二区三区| 精品第一国产综合精品aⅴ| 国产一区二区在线视频| 国产精品免费丝袜| 欧美色倩网站大全免费| 日日摸夜夜添夜夜添国产精品 | 国产成人精品综合在线观看| 国产精品日韩精品欧美在线| 色哟哟国产精品免费观看| 亚洲电影你懂得| 亚洲国产中文字幕在线视频综合| 国产精品久久久久三级| 成人18视频在线播放| 一区二区三区欧美在线观看| 欧美日韩aaaaaa| 国产一区二区91| 成人免费一区二区三区在线观看| 欧美无乱码久久久免费午夜一区| 日本欧美在线看| 中文天堂在线一区| 欧美丝袜丝交足nylons| 亚洲欧洲国产专区| 一区二区三区在线视频观看58| 国产三区在线成人av| 麻豆精品在线播放| 欧美国产日韩a欧美在线观看| 一本大道久久a久久综合婷婷| 日韩综合小视频| 国产三级欧美三级| 久久久亚洲综合| 精品精品国产高清a毛片牛牛| 五月天激情综合| 精品粉嫩超白一线天av| 91国偷自产一区二区三区成为亚洲经典 | 欧美三级一区二区| 国产美女一区二区三区| 亚洲精品国产高清久久伦理二区| 精品三级在线看| 色悠悠久久综合| 国产露脸91国语对白| 亚洲丶国产丶欧美一区二区三区| 国产精品丝袜黑色高跟| 日韩欧美色电影| 欧美亚洲国产bt| 99久久精品国产麻豆演员表| 国内不卡的二区三区中文字幕| 天天综合日日夜夜精品| 一区二区三区影院| 综合在线观看色| 日本一区二区不卡视频| 欧美本精品男人aⅴ天堂| 欧美精品色综合| 欧美美女喷水视频| 欧美影片第一页| 日本高清不卡aⅴ免费网站| 国产一区二区视频在线播放| 日韩成人av影视| 天堂一区二区在线| 亚洲国产欧美在线人成| 亚洲蜜臀av乱码久久精品| 欧美国产日韩亚洲一区| 国产亚洲视频系列| 国产午夜亚洲精品不卡| 精品国产乱码久久久久久影片| 51精品秘密在线观看| 欧美日韩一本到| 欧美午夜不卡在线观看免费| 欧美三级一区二区| 在线成人av影院| 日韩欧美国产成人一区二区| 欧美一区二区视频在线观看| 欧美日韩高清一区二区三区| 欧美日韩视频在线第一区| 欧美午夜精品免费| 欧美高清www午色夜在线视频| 欧美日韩国产一二三| 欧美一区二区精美| 欧美一区二区三区免费大片| 欧美一级黄色录像| 精品久久五月天| 国产亚洲综合色| 国产精品视频yy9299一区| 国产精品成人午夜| 亚洲精品免费在线| 日韩一区欧美二区| 国产毛片精品一区| 一本色道a无线码一区v| 这里是久久伊人| 久久品道一品道久久精品| 国产日韩欧美一区二区三区乱码| 亚洲欧洲日产国码二区| 亚洲v中文字幕| 日本不卡一区二区三区 | 在线看日韩精品电影| 欧美疯狂做受xxxx富婆| 精品国产一区二区三区四区四| 久久久午夜电影| 一区二区三区中文在线| 久久精品理论片| 色综合久久综合| 日韩一区二区免费在线观看| 久久久久久久电影| 亚洲免费在线视频一区 二区| 人妖欧美一区二区| 国产98色在线|日韩| 91国产成人在线|