日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue 字符串分割_嗯哼vue组件taginput包教不包会

發布時間:2023/12/2 vue 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue 字符串分割_嗯哼vue组件taginput包教不包会 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

5分鐘實現一個Tag-Input(標簽)組件

前言

本文是wo寫組件設計的第一篇文章(處女作),之所以會寫組件設計相關的文章,是因為作為一名優秀的前端工程師,面對各種繁瑣而重復的工作,我們不應該按部就班的去辛(dao)勤(gen)勞(huo)動(zhong),而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法。作為數據驅動的領導者vue等MVVM框架的出現,幫我們減少了工作中大量的冗余代碼,一切皆組件的思想深得人心。所以,為了讓工程師們有更多的時間去考慮業務和產品迭代,我們不得不掌握高質量組件設計的思路和方法。所以筆者將花時間去總結各種業務場景下的組件的設計思路和方法,并用原生框架的語法去實現各種常用組件的開發,希望等讓前端新手或者有一定工作經驗的朋友能有所收獲。

正文

在開始組件設計之前希望大家對css3和js有一定的基礎。我們先看看實現后的組件效果:TagInput是一種可編輯的輸入框,通過回車或者空格分割每個標簽,用 vue來實現還是比較簡單的。

先看效果圖,下面會一步一步實現他。由視頻演示可以知道tag-input組件可以自定義顏色主題(color theme), 可以手動關閉標簽。

組件設計思路

我們第一步是要確認需求,一個tag標簽組件一般都會有如下需求點:

  • 可以改變標簽顏色
  • 提供關閉標簽的配置,讓用戶可以關閉標簽
  • 需求收集好之后,作為一個有追求的程序員,會得出如下線框圖:

    vue有自帶的屬性檢測方式,這里就不介紹了.

    開工

    ?

    注:以下代碼需要vue-cli環境才能執行

    新建文件夾及相關文件

    在src/components/目錄中創建Tag-Input目錄,并且創建Tag-Input.vue文件和index.js文件。如下圖:

    布局

    搭建基本結構:

    <template>
    <div?class="tag-input">
    ??
    ??<div?class="tag-item"?v-for="item?in?tags"?:key="item">{{?item?}}div>
    ??
    ??<input?class="tag-input"?@keyup.space="generateTag"?v-model="value"?type="text">
    div>
    template>

    書寫基本邏輯:

  • 在組件內部維護一個tags數組默認為空數組
  • 在組件內部維護一個value字符串默認為空字符串
  • 書寫一個方法generateTag,綁定給input的keyup事件并且給定修飾符為space/enter,當輸入為合法字符串后,將當前的value值push到tags中 通過v-for循環出來。
  • 代碼如下:

    export?default?{
    ??name:?'Tag-Input',
    ??data?()?{
    ????return?{
    ??????tags:?[],
    ??????value:?''
    ????}
    ??},
    ??methods:?{
    ????generateTag?()?{
    ????//?判定value是否合法?不能唯空
    ??????if?(this.value.trim().length?>?0)?{
    ????????this.tags.push(this.value)
    ??????}
    ??????//?還原input的輸入狀態
    ??????this.value?=?''
    ????}
    ??}
    }

    外觀

    我們讓循環出來的tag和input出于同一行內,并且去掉input的border/out-line/和background,讓最外層的div.tag-input被模擬成一個input的感覺。

    個人覺得element-ui的tag組件蠻漂亮的,所以借鑒。畢竟讀書人不能叫竊取而是叫借鑒。傳送門

    .tag-input-warp{
    ????width:?80%;
    ????height:?150px;
    ????border-radius:?5px;
    ????border:?1px?solid?#666;
    ????margin:?auto;
    ????padding:?24px;
    ??}
    ??.tag-item,?.tag-input{
    ????display:?inline-block;
    ??}
    ??.tag-item{
    ????padding:?10px?14px;
    ????font-size:?14px;
    ????background-color:?#f2f9ec;
    ????color:?#84c259;
    ????border:?1px?solid?#e4fada;
    ????text-align:?center;
    ????margin:?6px;
    ????/*vertical-align:?middle;*/
    ??}
    ??.tag-input{
    ????border:?none;
    ????outline:?none;
    ??}
    ??.tag-text{
    ????vertical-align:?middle;
    ??}
    ??.tag-icon__close{
    ????cursor:?pointer;
    ????vertical-align:?middle;
    ????display:?inline-block;
    ????width:?16px;
    ????height:?16px;
    ????background-size:?contain;
    ????background-repeat:?no-repeat;
    ????background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgEAYAAAAj6qa3AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAjdJREFUaN7t1t9LU2EcBvDndRtKR6YX4UQCJevCi26k6CI0vYluBAeObZgEUdFNSjfhRNtGh04qBHUKN6iLfkjtUFANTE7E8OxClzLIbqSZrMARNEr6gTr1vF2tiyLQ9e5sg/fzB7x8n4fzft8DcBzHcRzHcWwEA3OzZ89YLKzP9dJYY/d5q/Wq9FJ1dFVVsTq3jN2AEXqSVld/vrE68P3T/Pzl5mizO9jZySq4+UPGps9MTm7uqrCb5WCw6Arwk3Zyl6ysYJYeAhSFpOgJDCmK+Cr6zXXJbt/peaP31AM9NYJgebC+sHUhHCbPqBVf6+pMvZs/9Nr+flZz5434Uxtwd/j9Yq12zV2TyWy3iGxw8b624VqamhKva8fd+5JJiUaokzY0FDpX3oooVHBidBFoxG7EPB6Mk9P0nNNZvrx6xBJQ1XVSEd+YmZjAF3SQY/X1pt6tF3qirc1D2kmIJJMlX8A/i9iD/fRdIoEe3CIHBcGo4FnMluB2lT9ZC5tjIyPwkCVYUym8xRsSbWoqG6c34ZAko4IbXkD2jv/+1EEXAQCn8JTKsqx/JM9xR5ZzfTWKtoC/gv9xxwfHWuceqX19eI80DksSuultEgiFjC4ib8F3utVzfT6LRvbPTfRpR13R6elcn7OSK4JVcKOLYLYDzBfXxnTRZoOAxySl61hAmu5tafnfrT4otF55GPZ68ZosIj48jFEaJ2mfT1EUxeEwmVjNXzK8NEIdXZWVhZ6D4ziO47jS9wur727+lgG2ewAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wNS0yOFQyMjowMzoyNiswODowMBt9NI0AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDUtMjhUMjI6MDM6MjYrMDg6MDBqIIwxAAAASHRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl92dXY4bmVpeTFjL2NoYWhhby5zdmc0h1nOAAAAAElFTkSuQmCC");
    ??}

    實際效果如下:

    感覺還行。。。

    v-model語法糖

    把內部的tag傳遞出去:

    Vue內置了v-model指令,v-model 是一個語法糖,可以拆解為 props: value 和 events: input。就是說組件只要提供一個名為 value 的 prop,以及名為 input 的自定義事件,滿足這兩個條件,使用者就能在自定義組件上使用 v-model;

    // v-model語法糖?關鍵
    this.$emit('input',?this.tags)
    //?使用方法
    <tag-input?v-model="res">
    //?通過res獲取內部狀態

    組件的export

    相信很多人在用Vue使用別人的組件時,會用到 Vue.use() 。例如:Vue.use(VueRouter)、Vue.use(MintUI)。那這是為什么吶?

    接下來我們自定義一個需要 Vue.use() 的組件,也就是有 install 的組件。

    //?index.js
    import?TagInput?from?'./Tag-Input.vue';

    /*?istanbul?ignore?next?*/
    TagInput.install?=?function(Vue)?{
    ??Vue.component(TagInput.name,?TagInput);
    };

    export?default?TagInput;

    Tag-Input的全局注冊

    // 引入組件
    import TagInput from '@/components/Tag-Input';
    Vue.use(TagInput)

    完整代碼

    <template>
    <div?class="tag-input-warp">
    ??
    ??<div?class="tag-item"?v-for="(item,?index)?in?tags"?:key="index">
    ????<span?class="tag-text">{{?item?}}span>
    ????<span?class="tag-icon__close"?@click="deleteTagByIndex(index)">span>
    ??div>
    ??
    ??<input?class="tag-input"?@keyup.space="generateTag"?autofocus?v-model="value"?type="text">
    div>
    template>

    <script>export?default?{name:?'Tag-Input',
    ??data?()?{return?{tags:?[],value:?''
    ????}
    ??},methods:?{
    ????generateTag?()?{if?(this.value.trim().length?>?0)?{this.tags.push(this.value)// v-model語法糖?關鍵this.$emit('input',?this.tags)
    ??????}this.value?=?''
    ????},
    ????deleteTagByIndex?(index)?{this.tags.splice(index,?1)
    ????}
    ??}
    }script>

    <style?scoped>.tag-input-warp{width:?80%;height:?150px;border-radius:?5px;border:?1px?solid?#666;margin:?auto;padding:?24px;
    ??}.tag-item,?.tag-input{display:?inline-block;
    ??}.tag-item{padding:?10px?14px;font-size:?14px;background-color:?#f2f9ec;color:?#84c259;border:?1px?solid?#e4fada;text-align:?center;margin:?6px;/*vertical-align:?middle;*/
    ??}.tag-input{border:?none;outline:?none;color:?#666666;
    ??}.tag-text{vertical-align:?middle;
    ??}.tag-icon__close{cursor:?pointer;vertical-align:?middle;display:?inline-block;width:?16px;height:?16px;background-size:?contain;background-repeat:?no-repeat;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgEAYAAAAj6qa3AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAjdJREFUaN7t1t9LU2EcBvDndRtKR6YX4UQCJevCi26k6CI0vYluBAeObZgEUdFNSjfhRNtGh04qBHUKN6iLfkjtUFANTE7E8OxClzLIbqSZrMARNEr6gTr1vF2tiyLQ9e5sg/fzB7x8n4fzft8DcBzHcRzHcWwEA3OzZ89YLKzP9dJYY/d5q/Wq9FJ1dFVVsTq3jN2AEXqSVld/vrE68P3T/Pzl5mizO9jZySq4+UPGps9MTm7uqrCb5WCw6Arwk3Zyl6ysYJYeAhSFpOgJDCmK+Cr6zXXJbt/peaP31AM9NYJgebC+sHUhHCbPqBVf6+pMvZs/9Nr+flZz5434Uxtwd/j9Yq12zV2TyWy3iGxw8b624VqamhKva8fd+5JJiUaokzY0FDpX3oooVHBidBFoxG7EPB6Mk9P0nNNZvrx6xBJQ1XVSEd+YmZjAF3SQY/X1pt6tF3qirc1D2kmIJJMlX8A/i9iD/fRdIoEe3CIHBcGo4FnMluB2lT9ZC5tjIyPwkCVYUym8xRsSbWoqG6c34ZAko4IbXkD2jv/+1EEXAQCn8JTKsqx/JM9xR5ZzfTWKtoC/gv9xxwfHWuceqX19eI80DksSuultEgiFjC4ib8F3utVzfT6LRvbPTfRpR13R6elcn7OSK4JVcKOLYLYDzBfXxnTRZoOAxySl61hAmu5tafnfrT4otF55GPZ68ZosIj48jFEaJ2mfT1EUxeEwmVjNXzK8NEIdXZWVhZ6D4ziO47jS9wur727+lgG2ewAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wNS0yOFQyMjowMzoyNiswODowMBt9NI0AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDUtMjhUMjI6MDM6MjYrMDg6MDBqIIwxAAAASHRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl92dXY4bmVpeTFjL2NoYWhhby5zdmc0h1nOAAAAAElFTkSuQmCC");
    ??}style>

    寫在最后

    本文寫到這里其實還有一些功能沒有實現,希望大家留言討論;后續我將會繼續發布button/dialog/icon/toast等等的組件的包教不包會系列, 來復盤我多年的組件化之旅。歡迎各位轉發收藏。

    總結

    以上是生活随笔為你收集整理的vue 字符串分割_嗯哼vue组件taginput包教不包会的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲高潮无码久久 | 黄色片在线视频 | 在线一区二区观看 | 女futa攻玩遍整个后宫 | 亚洲精品成人在线 | 在线免费观看av网站 | 一级大片儿 | 天堂av免费观看 | 欧美第一视频 | 人妻丰满熟妇岳av无码区hd | 求欧美精品网址 | 老头巨大又粗又长xxxxx | 高清乱码免费 | 日韩欧美一级视频 | 扩阴视频 | 欧美激情四区 | 亚洲精品成人久久 | 久久人妻免费视频 | 国产二级视频 | 精品国产欧美一区二区三区成人 | 欧美丰满美乳xxx高潮www | 男人的天堂久久 | 一级片播放 | 九色91丨porny丨丝袜 | 国产免费看黄 | 又黄又爽又色视频 | 波多野结衣影院 | 国产成人精品一区在线播放 | 国产97色在线 | 国产 | 一级久久久久久久 | sm久久捆绑调教精品一区 | 国产传媒在线观看 | 性欧美videos高清hd4k | 久热精品视频在线播放 | 91蜜臀精品国产自偷在线 | 美女被草出水 | 熟妇高潮一区二区 | 国产精品久久久久一区二区 | 亚洲精品亚洲人成人网 | 日本免费精品 | 无码人妻丰满熟妇区毛片18 | 999久久久精品 | 你懂的网址在线 | 欧美色性视频 | 日韩高清在线观看一区 | 污片视频在线观看 | 91免费网站在线观看 | 国产免费无码一区二区视频 | 好大好爽好舒服 | 亚洲亚洲人成综合网络 | 欧美人妖另类 | 免费一级淫片 | 国产精品久久久久影院色老大 | 91正在播放 | 小情侣高清国产在线播放 | 久久视频99| 毛片av在线观看 | 日韩av无码中文字幕 | 天堂中文在线免费观看 | 午夜影视网| 香蕉91视频 | www.欧美亚洲 | 99久久一区| 日本女优中文字幕 | av自拍偷拍| 精品少妇v888av | 久久婷婷一区 | 亚洲97在线 | 欧美性猛交xxxx乱大交hd | 在线观看av黄色 | 免费在线黄 | 欧美性做爰大片免费 | av中文字幕网站 | 成人欧美激情 | 三级视频网站在线观看 | 久久婷色| 中文字幕日韩三级 | 精品久久久噜噜噜久久久 | 91小视频在线观看 | 久久嫩草精品久久久久 | 国产美女在线观看 | 少妇饥渴放荡91麻豆 | 久久久成 | 国产精品日日夜夜 | 99久久精品一区二区 | 日本在线激情 | 久久亚洲精品视频 | 99精品视频国产 | 91精品久久久久久粉嫩 | 日本黄色片一级 | 午夜在线小视频 | 亚洲AV无码片久久精品 | 久久精品h| 欧美亚洲在线播放 | 成年人的免费视频 | 国产一二三级 | 九色影视| 日韩久久久久久久久 | 在线观看国产一区 |