久久精品国产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樣式對現有選項進行外觀美化,并進一步研究數據校驗問題。

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

    9000px;">

      亚洲欧洲日本精品| 亚洲国产精品成人无久久精品| 国产夫妻性爱视频| 中文字幕丰满乱子伦无码专区| 嫩草影院一区二区| 国产免费a视频| 992在线观看| 中文字幕xxxx| 日韩毛片一区二区三区| 黄色片中文字幕| 丰满人妻av一区二区三区| 中文字幕在线观看2018| 特级做a爱片免费69| 男女一区二区三区| 精品一区二区三区人妻| 国产精品一区二区免费视频| 一级特黄aaa| 最近日韩免费视频| 伊人久久久久久久久久久久久久| 日本a级c片免费看三区| 久久久久亚洲AV成人无在| 国产一区二区在线视频聊天| www.av视频| 亚洲一级在线播放| 中文字幕一区二区三区人妻| 午夜激情福利电影| 色婷婷在线观看视频| 久久人人爽人人爽人人| 国产熟女一区二区三区五月婷| avtt中文字幕| 99精品国产99久久久久久97| 一级黄色大片免费观看| 亚洲国产精品久久久久爰性色 | 九九九九九国产| 国产精品一区二区小说| 超碰在线人人爱| 999久久久久久| 538国产视频| 91女人18毛片水多国产| 91精品国自产在线| 91久久国语露脸精品国产高跟| 亚洲区 欧美区| 亚洲精品一区二区三区影院忠贞| 中国黄色片一级| 永久av免费在线观看| 亚洲福利在线观看视频| 在线观看中文字幕视频| 一区二区视频在线免费观看| 在线观看黄网址| 中文字幕一区二区三区四| 最近中文字幕在线免费观看| 亚洲国产综合一区| 亚洲毛片亚洲毛片亚洲毛片 | 日本va欧美va国产激情| 欧美日韩一二三四区| 麻豆国产尤物av尤物在线观看| 久久午夜鲁丝片| 欧美精品韩国精品| 日本熟妇人妻中出| 色www免费视频| 天天久久综合网| 香蕉久久久久久av成人| 亚洲AV无码一区二区三区少妇| 亚洲AV无码一区二区三区少妇 | 91精品国产乱码在线观看| 91麻豆精品国产91久久综合| 波多野结衣在线观看一区| 国产福利短视频| 黄色aaa大片| 久久久美女视频| 日本视频在线观看免费| 无码人妻精品一区二区蜜桃色欲| 午夜天堂在线视频| 中文字幕免费播放| 6080国产精品| 国产对白videos麻豆高潮| 国产免费一区二区三区四区五区 | 国产性生活视频| 久久精品99北条麻妃| 清纯粉嫩极品夜夜嗨av| 五月婷婷激情视频| 亚洲欧美丝袜中文综合| av天堂一区二区| 国产嫩草在线观看| 蜜臀视频一区二区三区| 日韩欧美不卡视频| 在线观看中文av| www.欧美色| 黄色av一区二区三区| 欧洲美熟女乱又伦| 午夜精品久久久久久久99热影院 | 日韩欧美成人一区二区三区| 一区二区视频网站| 91嫩草丨国产丨精品| 国产一二三四区| 欧美视频一区二区在线| 亚洲福利精品视频| a天堂在线视频| 久久精品视频1| 姝姝窝人体www聚色窝| 最新一区二区三区| 国产成人精品综合久久久久99 | 国产一国产二国产三| 欧美色图亚洲激情| 中文在线第一页| 国产91在线免费观看| 免费麻豆国产一区二区三区四区| 无码av免费精品一区二区三区| 亚洲午夜精品久久久久久高潮| 国产精品入口麻豆| 欧美熟妇精品一区二区蜜桃视频| 亚洲福利精品视频| 国产 xxxx| 欧美一级特黄aaaaaa大片在线观看| 亚洲av午夜精品一区二区三区| av丝袜天堂网| 蜜臀av免费观看| 中文人妻av久久人妻18| 国产精品三区在线观看| 日本免费精品视频| 91麻豆免费视频网站| 久久久久久久无码| 中文字幕国产免费| 国模私拍一区二区| 午夜一区二区视频| 国产叼嘿视频在线观看| 色啦啦av综合| www.97超碰| 日韩精品一区二区三区国语自制| 91成人在线免费视频| 毛片网站免费观看| 亚洲免费国产视频| 久久久久中文字幕亚洲精品| 亚洲国产高清av| 久久久久久福利| 亚洲久久在线观看| 精品无码一区二区三区蜜臀| 中文字幕另类日韩欧美亚洲嫩草| 国产影视一区二区| 中文字幕人妻丝袜乱一区三区| 国产又色又爽又黄又免费| 无码免费一区二区三区| 国产老熟女伦老熟妇露脸| 五月天丁香社区| 国产午夜精品久久久久久久久| 亚洲av无码一区二区三区人| 国产又粗又猛又黄又爽| 中文字幕久久网| 免费黄色av网址| 91视频在线视频| 日韩xxxxxxxxx| 国产精品一级视频| 在线视频 中文字幕| 精品无码久久久久| 亚洲一级特黄毛片| 日韩 欧美 综合| 国产精品嫩草av| 在线观看成人动漫| 久久综合成人网| www.黄色片| 性猛交╳xxx乱大交| 久久久国产精品黄毛片| 91香蕉国产线在线观看| 神马久久久久久久久久| 国产视频不卡在线| 中文字幕在线视频免费| 免费黄色a级片| 草草地址线路①屁屁影院成人| 偷拍女澡堂一区二区三区| 国产综合精品久久久久成人av| 最近日韩免费视频| 日本午夜视频在线观看| 国产无精乱码一区二区三区| 亚洲精品20p| 日本不卡一区在线| 国产亚洲欧美日韩高清| 亚洲人成色777777精品音频| 日本一二区免费| 国产亚洲精品熟女国产成人 | 亚洲 欧美 视频| 美女视频久久久| 国产精品51麻豆cm传媒| 亚洲精品国产久| 色婷婷狠狠18| 久久久久久无码午夜精品直播| 超碰在线国产97| 亚洲欧洲综合网| 无码人妻aⅴ一区二区三区69岛| 久久久久99精品成人片我成大片| www.日本高清| 亚洲国产美女视频| 天堂网在线观看视频| 久久久久久久久久一区二区三区| 国产91丝袜美女在线播放| 亚洲精品第五页| 五月天婷婷激情网| 青青草原国产视频| 久草免费在线观看视频| 成人av网站在线播放| 亚洲中文字幕一区二区|