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的实现过程。在实际应用中,我们需要根据具体场景来设计搜索逻辑,以最大程度地提高用户体验。