久久精品国产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国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

    在线看一区二区| 国产欧美在线观看| 亚洲国产日韩欧美在线99| 欧美激情小视频| 欧美日韩在线综合| 亚洲欧美在线高清| 国产欧美婷婷中文| 久久国产精品久久久久久电车 | 狠狠色噜噜狠狠色综合久| 亚洲一区二区在线免费观看视频| 国产精品福利在线观看| 亚洲淫性视频| 亚洲国产精品专区久久| 国产精品国产三级国产专播品爱网| 夜夜狂射影院欧美极品| 国产欧美日韩精品一区| 裸体丰满少妇做受久久99精品| 亚洲黄色在线| 好吊色欧美一区二区三区视频| 美女日韩欧美| 久久国产欧美| 亚洲一本视频| 亚洲黄色在线观看| 黄色一区三区| 国产一区二区三区久久悠悠色av| 免费久久99精品国产自| 久久久99精品免费观看不卡| 一区二区高清视频在线观看| 91久久精品久久国产性色也91| 国产精品大片| 国产精品chinese| 欧美日韩p片| 欧美日韩精品| 欧美午夜精品理论片a级大开眼界| 久久久水蜜桃| 玖玖综合伊人| 亚洲午夜高清视频| 国产自产高清不卡| 狠狠色丁香久久婷婷综合_中| 国产精品v欧美精品∨日韩| 欧美成人性生活| 欧美激情自拍| 国产乱码精品一区二区三区不卡| 欧美日本亚洲视频| 亚洲欧美精品在线| 日韩亚洲欧美在线观看| 一本色道久久综合狠狠躁的推荐| 91久久久国产精品| 欧美一区二视频| 蜜臀av在线播放一区二区三区| 欧美成熟视频| 国产麻豆综合| 一本久久a久久精品亚洲| 亚洲欧美日韩一区| 欧美日韩成人激情| 激情欧美丁香| 亚洲欧美亚洲| 欧美精品 日韩| 激情综合中文娱乐网| 亚洲欧美日韩国产综合| 欧美精品在线视频观看| 国产曰批免费观看久久久| 91久久久国产精品| 麻豆国产va免费精品高清在线| 国产精品日韩高清| 亚洲免费影院| 国产精品乱码| 欧美一区二区在线观看| 国产精品人人做人人爽人人添| 99精品热视频只有精品10| 欧美aa国产视频| 亚洲国产欧美国产综合一区| 久久久av水蜜桃| 亚洲成人在线| 欧美日本网站| 欧美在线综合视频| 亚洲经典在线| 欧美日韩国产一区二区三区| 亚洲永久免费精品| 国产日韩在线不卡| 免费91麻豆精品国产自产在线观看| 黄网站色欧美视频| 欧美日韩喷水| 久久国内精品自在自线400部| 精品动漫3d一区二区三区免费| 免费成人黄色| 欧美在线中文字幕| 亚洲人成欧美中文字幕| 国产精品久久久久影院色老大| 久久久久国产精品www| 国产主播一区二区三区| 一区二区三区毛片| 国产伦精品一区二区三区照片91 | 欧美精品久久久久久久| 亚洲免费在线播放| 亚洲午夜精品一区二区| 亚洲国产精品一区二区www| 国产精品福利在线观看| 另类酷文…触手系列精品集v1小说| 日韩亚洲精品在线| 亚洲人成网在线播放| 国产亚洲在线观看| 国产视频一区二区在线观看 | 久久裸体艺术| 麻豆成人在线观看| 免费亚洲网站| 裸体女人亚洲精品一区| 开心色5月久久精品| 美女精品视频一区| 欧美精品午夜视频| 欧美三级视频| 国产精品永久免费| 国语自产在线不卡| 亚洲精品国产精品国自产在线| 日韩一级欧洲| 久久国内精品视频| 久久综合伊人77777尤物| 欧美激情精品久久久久久蜜臀| 欧美四级电影网站| 韩日精品视频| 亚洲综合色婷婷| 欧美激情一区二区在线| 国产精品一区二区你懂得| 伊甸园精品99久久久久久| 99亚洲视频| 欧美aaa级| 一区二区亚洲精品| 午夜精品国产精品大乳美女| 亚洲欧美日韩综合| 久久精品91久久香蕉加勒比 | 亚洲视频免费看| 久久亚洲综合色| 国产亚洲免费的视频看| 亚洲一级免费视频| 欧美日韩成人在线播放| 国内精品嫩模av私拍在线观看| 欧美日韩国产精品专区| 韩国av一区二区| 亚洲欧美制服另类日韩| 国产精品美女主播在线观看纯欲| 亚洲免费av电影| 欧美日韩精品不卡| 日韩视频在线观看免费| 欧美色精品天天在线观看视频 | 国精品一区二区三区| 欧美一级精品大片| 国产精品日韩二区| 性色av一区二区三区在线观看 | 欧美福利一区二区三区| 亚洲精品国产欧美| 欧美三区视频| 久久久亚洲一区| 亚洲欧洲精品一区二区三区波多野1战4| 久久亚洲国产精品日日av夜夜| 亚洲国产精品嫩草影院| 欧美日韩国产欧| 先锋影院在线亚洲| 91久久国产综合久久蜜月精品| 欧美激情久久久久| 久久精品国产清高在天天线| 亚洲电影av在线| 国产麻豆视频精品| 国产精品theporn88| 欧美激情视频一区二区三区在线播放| 亚洲午夜免费视频| aa成人免费视频| 日韩图片一区| 亚洲人永久免费| 亚洲国产精品一区二区第一页| 国产精品欧美一区二区三区奶水| 欧美成人亚洲成人| 狂野欧美激情性xxxx| 久久久久久国产精品mv| 久久不射电影网| 久久久久久自在自线| 久久久无码精品亚洲日韩按摩| 午夜精品久久久久久久99热浪潮| 一本一道久久综合狠狠老精东影业| 伊人久久av导航| 亚洲三级电影在线观看| 亚洲激情电影在线| 亚洲精品一品区二品区三品区| 91久久精品网| 亚洲综合大片69999| 久久国产精品99国产精| 欧美亚洲一区在线| 亚洲视屏在线播放| 一区二区三区久久网| 亚洲一区在线播放| 久久亚洲高清| 欧美日韩视频在线一区二区观看视频 | 国产亚洲一本大道中文在线| 黄色一区三区| 亚洲综合导航| 欧美国产日韩精品免费观看| 国产精品入口66mio| 亚洲欧洲精品一区二区三区不卡 | 精品成人在线| 亚洲在线视频网站| 欧美激情一区二区三区全黄 |