uniapp 怎么实现模糊搜索

uniapp如何实现模糊搜索?

1.什么是模糊搜索?

模糊搜索是一种常用的搜索方式,指的是可以在搜索关键词中含有一定的误差,但仍能够搜索出相关内容的方式。例如,输入“苹果”时,模糊搜索可以返回包含单词“苹果”、单词拼写错误的“苹饱”、“苹果汁”等相关结果。

2.uniapp如何实现模糊搜索?

在uniapp中实现模糊搜索,可以借助vuex和动态组件的特性来实现。下面将结合代码进行讲解。

3.搜索框组件的实现

首先,在根目录下创建一个store文件夹,用于存放vuex的相关代码。在store文件夹中创建一个名为search.js的js文件:

// search.js

const state = {

searchResult: [],

}

const mutations = {

setSearchResult(state, payload) {

state.searchResult = payload

},

}

const actions = {

async setSearchResult({ commit }, keyword) {

// 发起请求获取匹配关键词的数据

const res = await fetch(`https://api.example.com/search?keyword=${keyword}`)

const searchResult = await res.json()

commit('setSearchResult', searchResult)

},

}

export default {

namespaced: true,

state,

mutations,

actions,

}

在上述代码中,我们定义了一个名为search.js的vuex模块,其中包括了state、mutations和actions三个部分。searchResult即为搜索结果存放的数组,setSearchResult为修改state的mutation方法,setSearchResult为触发异步action发起请求的方法。

接下来,在pages目录下创建一个名为search的页面用于展示搜索框和搜索结果,复制以下代码进入该页面的vue文件中:

<template>

<div class="search-page">

<div class="search-box">

<input type="text" v-model="keyword" placeholder="请输入搜索关键词" @input="handleInput">

<button @click="handleSearch">搜索</button>

</div>

<div class="search-result">

<component v-for="(item, index) in searchResult" :key="index" :is="item.component" :data="item.data"></component>

</div>

</div>

</template>

<script>

export default {

data() {

return {

keyword: '',

}

},

computed: {

...mapState('search', ['searchResult']),

},

methods: {

...mapActions('search', ['setSearchResult']),

handleInput(event) {

this.keyword = event.target.value

},

async handleSearch() {

await this.setSearchResult(this.keyword)

},

},

}

</script>

<style>

.search-page {

margin-top: 20px;

padding: 10px;

}

.search-box {

display: flex;

align-items: center;

margin-bottom: 20px;

}

.search-box input {

flex-grow: 1;

margin-right: 10px;

}

.search-box button {

padding: 5px 10px;

background-color: #fff;

border: 1px solid #ddd;

}

.search-result {

display: flex;

justify-content: center;

flex-wrap: wrap;

}

.search-item {

margin: 10px;

width: 200px;

height: 200px;

border: 1px solid #ddd;

display: flex;

justify-content: center;

align-items: center;

}

</style>

在上述代码中,我们在template中创建了一个搜索框和一个搜索结果展示区域。我们在需要搜索的input元素上绑定了一个v-model,当用户在输入框中输入关键词时,该值会自动同步到keyword变量中。在搜索按钮上绑定了一个点击事件,点击后会触发handleSearch方法,该方法会调用setSearchResult方法,将关键词传递给setSearchResult方法,然后触发actions中异步的setSearchResult方法。

4.搜索结果组件的实现

接下来,我们需要创建一些组件,用于展示搜索结果的具体信息。我们首先需要在components目录下创建一个名为search-item的组件:

<template>

<div class="search-item">

{{ data.title }}

</div>

</template>

<script>

export default {

props: ['data'],

}

</script>

<style>

.search-item {

margin: 10px;

width: 200px;

height: 200px;

border: 1px solid #ddd;

display: flex;

justify-content: center;

align-items: center;

}

</style>

在上述代码中,我们创建了一个名为search-item的组件,用于展示搜索结果的具体信息。我们在template中展示了data.title,并设置了固定的样式。

需要注意的是,在vue中使用动态组件时,必须将各组件的名称与其对应的项以对象形式写在computed计算属性中。我们可以在search.vue页面中的computed计算属性中添加和下面相似的代码:

...mapState('search', {

components: state => state.searchResult.map(item => ({

component: 'search-item',

data: item,

})),

}),

在上述代码中,我们使用了mapState辅助函数,将state中的searchResult转换成component的数组,并以对象形式写在了计算属性中。

5.服务端接口的实现

在完成搜索框和搜索结果组件的编写后,我们需要提供一个服务端接口,用于返回匹配关键词的数据。我们可以在node.js中使用express框架快速搭建一个服务端接口。在根目录下创建一个名为server.js的文件,并复制以下代码至其中:

// server.js

const express = require('express')

const app = express()

app.get('/search', (req, res) => {

const keyword = req.query.keyword

const data = [

{ id: 1, title: `关于${keyword}的新闻`, component: 'search-item' },

{ id: 2, title: `这是一篇有关${keyword}的文章`, component: 'search-item' },

{ id: 3, title: `${keyword}相关的图书推荐`, component: 'search-item' },

]

res.json(data)

})

app.listen(3000, () => {

console.log('server is running at port 3000')

})

在上述代码中,我们引入了express框架,并在服务端创建了一个/get接口,用于接收前端传递的关键词。接口中会根据关键词返回一组模拟的数据。

6.启动项目

最后,我们需要启动项目,才能看到搜索框和搜索结果的实际效果。我们可以在命令行中输入以下命令来启动项目:

npm install

npm run serve

运行成功后,我们可以在浏览器中访问http://localhost:8080/search页面,即可看到实现的搜索框和搜索结果组件。

总结

通过以上的代码实现,我们成功地实现了在uniapp中进行模糊搜索的功能,同时也介绍了在动态组件的使用和vuex的实现过程。在实际应用中,我们需要根据具体场景来设计搜索逻辑,以最大程度地提高用户体验。