zoukankan      html  css  js  c++  java
  • VUE移动端音乐APP学习【二十】:搜索框组件开发

    搜索框组件是个基础组件,其结构如下:

    <template>
      <div class="search">
        <div class="search-box-wrapper"></div>
      </div>
    </template>
    
    <script>
    export default {
      name: 'search',
    };
    
    </script>
    <style lang="scss" scoped>
    .search {
      .search-box-wrapper {
        margin: 20px;
      }
    
      .shortcut-wrapper {
        position: fixed;
        top: 178px;
        bottom: 0;
        width: 100%;
    
        .shortcut {
          height: 100%;
          overflow: hidden;
    
          .hot-key {
            margin: 0 20px 20px 20px;
    
            .title {
              margin-bottom: 20px;
              font-size: $font-size-medium;
              color: $color-text-l;
            }
    
            .item {
              display: inline-block;
              padding: 5px 10px;
              margin: 0 20px 10px 0;
              border-radius: 6px;
              background: $color-highlight-background;
              font-size: $font-size-medium;
              color: $color-text-d;
            }
          }
    
          .search-history {
            position: relative;
            margin: 0 20px;
    
            .title {
              display: flex;
              align-items: center;
              height: 40px;
              font-size: $font-size-medium;
              color: $color-text-l;
    
              .text {
                flex: 1;
              }
    
              .clear {
                @include extend-click();
    
                .icon-clear {
                  font-size: $font-size-medium;
                  color: $color-text-d;
                }
              }
            }
          }
        }
      }
    
      .search-result {
        position: fixed;
        width: 100%;
        top: 178px;
        bottom: 0;
      }
    }
    </style>
    search-box.vue

    在search组件中引入它

    <template>
      <div class="search">
        <div class="search-box-wrapper">
          <search-box></search-box>
        </div>
      </div>
    </template>
    
    <script>
    import SearchBox from '../../base/search-box/search-box.vue';
    
    export default {
      name: 'search',
      components: {
        SearchBox,
      },
    };
    
    </script>

     在搜索框中设置默认文字

      <div class="search-box">
        <i class="iconfont icon-search"></i>
        <input class="box" :placeholder="placeholder"/>
        <i class="iconfont icon-dismiss"></i>
     </div>
    
    
    export default {
      props: {
        placeholder: {
          type: String,
          default: '搜索歌曲、歌手',
        },
      },
    };

     用v-model让input和数据绑定起来,当有数据输入到input时,v-model这个指令对应到query有变化,query有变化对应到v-show就会使icon-dismiss显示。

      <div class="search-box">
        <i class="iconfont icon-search"></i>
        <input class="box" v-model="query" :placeholder="placeholder"/>
        <i v-show="query" class="iconfont icon-dismiss"></i>
      </div>
    
    
     data() {
        return {
          query: '',
        };
      },

     添加点击事件:当点击icon-dismiss这个图标时,清空input的内容,并隐藏该图标。

     <i @click="clear" v-show="query" class="iconfont icon-dismiss"></i>
    
    
    methods: {
        clear() {
          this.query = '';
        },
      },

    这个搜索框的作用就是获取query内容并传递到外面。当query发生改变的时候,组件就会派发事件告诉外部组件'我有变化'

    思路:只需要watch这个query,然后把它当作事件的参数派发出去。(这里采用回调的方式)

     created() {
        this.$watch('query', (newQuery) => {
          this.$emit('query', newQuery);
        });
      },

    优化:

    点击input时会发现点击不灵敏,没有反应

    需要使用fastclick解决这个问题

    main.js中添加以下代码:

    fastclick.prototype.focus = function (targetElement) {
      let length;
      if (targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
        length = targetElement.value.length;
        targetElement.focus();
        targetElement.setSelectionRange(length, length);
      } else {
        targetElement.focus();
      }
    };
  • 相关阅读:
    MySQL数据库的主从同步
    学习Java必看的Java书籍(高清中文最新版附下载链接)
    servlet重点知识总结
    JUnit & JMockit单元测试
    mongodb重点知识总结
    Quartz学习总结
    IDEA使用总结
    bat脚本知识总结
    linux shell脚本相关知识
    SpringMVC重点知识总结
  • 原文地址:https://www.cnblogs.com/Small-Windmill/p/14952057.html
Copyright © 2011-2022 走看看