uni-app实现的搜索功能 可以应用到vue和小程序

search.vue 

<template>
    <view class="search" :style="{ backgroundColor: backgroundColor }">
        <view class="content" :style="{ 'border-radius': radius + 'px', border: border }">
            <view class="content-box" :class="{ center: mode === 2 }">
                <text class="icon icon-search">&#xe61c;</text>
                <input class="input" :class="{ center: !active && mode === 2 }" :focus="isFocus" :placeholder="placeholder" v-model="inputVal" @focus="focus" @blur="blur" />
                <!-- <view v-if="!active && mode === 2" class="input sub" @click="getFocus">请输入搜索内容</view> -->
                <text v-if="isDelShow" class="icon icon-del" @click="clear">&#xe644;</text>
            </view>
            <view v-show="(active && show && button === 'inside') || (isDelShow && button === 'inside')" class="searchBtn" @click="search">搜索</view>
        </view>
        <view v-if="button === 'outside'" class="button" :class="{ active: show || active }" @click="search">
            <view class="button-item">{{ !show ? searchName : '搜索' }}</view>
        </view>
    </view>
</template>
 
<script>
export default {
    props: {
        mode: {
            type: Number,
            default: 1
        },
        button: {
            type: String,
            default: 'outside'
        },
        show: {
            type: Boolean,
            default: true
        },
        radius: {
            type: String,
            default: '60'
        },
        placeholder: {
            type: String,
            default: '请输入搜索内容'
        },
        backgroundColor: {
            type: String,
            default: '#fff'
        },
        border: { type: String, default: '1px #f5f5f5 solid' }
        
    },
    data() {
        return {
            active: false,
            inputVal: '',
            searchName: '取消',
            isDelShow: false,
            isFocus: false
        };
    },
    methods: {
        focus() {
            this.active = true;
        },
        blur() {
            this.isFocus = false;
            if (!this.inputVal) {
                this.active = false;
            }
        },
        clear() {
            this.inputVal = '';
            this.active = false;
            this.$emit('search', '');
        },
        getFocus() {
            this.isFocus = true;
        },
        search() {
            if (!this.inputVal) return;
            console.log(this.inputVal);
            this.$emit('search', this.inputVal);
        }
    },
    watch: {
        inputVal(newVal) {
            if (newVal) {
                this.searchName = '搜索';
                this.isDelShow = true;
            } else {
                this.searchName = '取消';
                this.isDelShow = false;
            }
        }
    }
};
</script>
 
<style lang="scss" scoped>
.search {
    display: flex;
    width: 100%;
    border-bottom: 1px #f5f5f5 solid;
    box-sizing: border-box;
    padding: 15upx;
    font-size: $uni-font-size-base;
    background: #fff;
    .content {
        display: flex;
        align-items: center;
        width: 100%;
        height: 60upx;
        border: 1px #ccc solid;
        background: #fff;
        overflow: hidden;
        transition: all 0.2s linear;
        border-radius: 30px;
 
        .content-box {
            width: 100%;
            display: flex;
            align-items: center;
            background-color:#F4F4F4;
            &.center {
                justify-content: center;
            }
            .icon {
                padding: 0 15upx;
                
                &.icon-del {
                    font-size: 38upx;
                    
                }
            }
            .input {
                width: 100%;
                max-width: 100%;
                line-height: 60upx;
                height: 60upx;
                color:#333;
                font-size:28upx;
                // transition: all 0.2s linear;
                &.center {
                    width: 200upx;
                }
                &.sub {
                    // position: absolute;
                    width: auto;
                    color: grey;
                }
            }
        }
        .searchBtn {
            height: 100%;
            flex-shrink: 0;
            padding: 0 30upx;
            background: $uni-color-success;
            line-height: 60upx;
            color: #fff;
            border-left: 1px #ccc solid;
            transition: all 0.3s;
        }
    }
 
    .button {
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
        flex-shrink: 0;
        width: 0;
        transition: all 0.2s linear;
        white-space: nowrap;
        overflow: hidden;
        &.active {
            padding-left: 15upx;
            width: 100upx;
            color: #8BC34A;
        }
    }
}
@font-face {
    font-family: 'iconfont';
    src: url('https://at.alicdn.com/t/font_989023_efq0mtli526.ttf') format('truetype');
}
.icon {
    font-family: iconfont;
    font-size: 32upx;
    font-style: normal;
    color: #999;
}
</style>
 

引用 搜索框

Quotesearch.vue

<template>
    <view>
      =============================
    使用
        <mSearch :show="false" @search="search($event, 1)"></mSearch>
      ==================================
下面是写的一些别的 可以不用看
 
        <view class="hot-search-wrap" v-if="isShowHotKey">
            <view class="hot-search"><text class="shugang"></text> <text class="textinfo">热门搜索</text> </view>
            <view class="hot-key-wrap">
                <view class="hot-key" v-for="(item, index) in mhotKey" :key="index" @tap="search(item, '')">{{ item }}</view>
            </view>
        </view>
        <view class="wrapper" v-if="jobList">
            <view class="job-list-wrap">
                <view class="job-list" v-for="(item, index) in jobList" :key="item.id" @tap="goDetailPage(item.id)">
                    <view class="icon"><image :src="item.thumbimg" mode=""></image></view>
                    <view class="job-con-wrap">
                        <view class="job-title">
                        {{ item.product_name }} 
                        <image class="hot" :src="item.tag_logo" mode=""></image>
                        </view>
                        <view class="job-tip">{{ item.settlement }} | {{ item.recruitment }} | {{ item.sex }}</view>
                    </view>
                    <view class="job-rich">
                        <text class="job-salary">{{ item.remuneration }}</text>
                        <text class="job-cen">{{ item.remuneration_type }}</text>
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
 
<script>
//引入进来
 
import mSearch from '@/components/mehaotian-search/search.vue';
api 是封装了请求数据 不用看
import { api } from '@/common/api.js';
export default {
 
// 注册子组件
    components: {
        mSearch
    },
 
    data() {
        return {
            keyword: '',
            jobList: '',
            mhotKey: ['服务员', '客服', '销售', '在线直播','提成','校园代理','家教','餐饮','促销','派单','日结','分拣打包'],
            isShowHotKey: true
        };
    },
    methods: {
        search(e, val) {
            // console.log(e, val);
            // this['val'+val] = e;
            if (e == '') {
                uni.showToast({
                    title: '请输入关键词',
                    icon: 'none',
                    duration: 2000
                });
                return;
            }
            this.getJoblist(1, 20, e).then(rs => {
                let [err, res] = rs;
                let { code, data } = res.data;
                if (code == 1001) {
                    this.jobList = data;
                    this.isShowHotKey = false;
                } else {
                    uni.showToast({
                        title: '换一个关键词试试吧',
                        icon: 'none',
                        duration: 2000
                    });
                }
            });
        },
        goDetailPage(key) {
            uni.navigateTo({
                url: '/pages/select/detail?id=' + key
            });
        },
        getJoblist(_page = 1, _limit = 10, _keyword) {
接口换成自己的
            return api.post('https://job.liaotaba.com/api/product/dataList', {
                page: _page,
                limit: _limit,
                product_type: this.pid,
                keyword: _keyword,
                token: uni.getStorageSync('token') ? uni.getStorageSync('token') : '',
                uid: uni.getStorageSync('uid') ? uni.getStorageSync('uid') : '',
                type: '',
                is_selected: '',
                is_hot: '',
                is_tuijian: ''
            });
        }
    }
};
</script>
<style lang="scss">
.hot-search-wrap {
    padding: 20upx;
    .hot-search {
            font-size: 32upx;
            font-weight: 500;
            color: #333;
            padding:10upx;
            overflow: hidden;
            position:relative;
            .shugang{
                display: inline-block;
                width: 6upx;
                height: 30upx;
                background-color: #89C756;
                position: absolute;
                top: 18upx;
                left: 30upx;
            }
            .textinfo{
                display: inline-block;
                width: 200upx;
                height: 34upx;
                margin-left: 40upx;
                color: #333333;
                font-weight: 600;
                
                
            }
    }
    .hot-key-wrap {
        overflow: hidden;
        margin-top: 20upx;
        .hot-key {
            float: left;
            margin-right: 20upx;
            padding: 14upx 40upx;
            margin-bottom: 30upx;
            background: #f4f4f4;
            font-size: 28upx;
            border-radius: 10upx;
            color: #898989;
            font-weight: 600;
        }
    }
}
.wrapper {
    padding: 10upx 30upx 0;
}
.job-list-wrap {
    overflow: hidden;
    .job-list {
        overflow: hidden;
        border-bottom: 2upx solid #d7d7d7;
        padding: 30upx 0 32upx;
        .icon {
            float: left;
            width: 56upx;
            height: 56upx;
            image {
                width: 56upx;
                height: 56upx;
            }
        }
        .job-con-wrap {
            float: left;
            margin-left: 19upx;
            width: 424upx;
            font-size: 30upx;
            .job-title {
                overflow: hidden;
                white-space: nowrap;
                text-overflow: ellipsis;
                color: #333333;
                font-size: 35upx;
                font-weight: 600;
                .hot {
                    width: 60upx;
                    height: 30upx;
                    margin-left: 20upx;
                }
            }
            .job-tip {
                margin-top: 22upx;
                font-size: 24upx;
                color: #868686;
                clear: both;
            }
        }
        .job-rich {
            float: left;
            width: 190upx;
            text-align: right;
            font-size: 36upx;
            font-weight:600;
            color:rgba(229,28,35,1);
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
            margin-top: 30upx;
            .job-salary {
                font-size:36upx;
                font-family:PingFangSC;
                font-weight:600;
                color:rgba(229,28,35,1);
                text-align: right;
            }
            .job-cen{
                font-size:28upx;
                font-family:PingFangSC;
                font-weight:400;
                color:rgba(229,28,35,1);
                text-align: right;
            }
        }
    }
}
</style>
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅坞茶坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值