1. 前言
在开发一个包含数据展示的应用中,搜索功能是必不可少的一项功能。在uniapp中,我们可以通过一些插件或者自己编写代码实现搜索功能。本文将会介绍如何在uniapp中利用uCharts插件和vuex实现搜索。
2. uCharts插件的集成
2.1 uCharts插件介绍
uCharts是一个提供在uniapp和微信小程序中使用的图表库。官方提供了多种图表类型,并且可以通过配置进行图表的自定义样式。本文需要用到的是uSearch组件,可以实现输入框联想搜索和清空功能。
2.2 uCharts插件的引入
在uniapp项目中,我们可以通过npm安装uCharts插件,并通过Vue.use()方法将其引入。安装命令如下:
npm install ucharts --save
然后在main.js中进行引入:
import uCharts from '@/lib/u-charts/u-charts.js';
Vue.use(uCharts);
3. 编写搜索组件
3.1 搜索框的实现
搜索框可以使用uni-ui中的输入框组件,需要在template中进行声明。需要注意的是,搜索框的输入会触发vuex中的action,并触发搜索结果的更新,因此需要给输入框绑定一个onInput方法:
<template>
<view class="search">
<view class="uni-input search-input">
<uni-icons type="search" class="input-icon"></uni-icons>
<input class="input-field" type="text" placeholder="请输入搜索关键字" :value="searchValue" @input="onInput">
<uni-icons type="clear" class="clear-icon" @tap="onClear"></uni-icons>
</view>
</view>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
export default {
data() {
return {
searchValue: ''
};
},
computed: {
...mapState(['searchResult'])
},
methods: {
...mapMutations(['updateSearchValue']),
...mapActions(['search']),
onInput(e) {
this.updateSearchValue(e.target.value);
this.search();
},
onClear() {
this.updateSearchValue('');
this.search();
}
}
};
</script>
在data中声明了searchValue,代表了搜索框内的输入值,在计算属性中声明了searchResult,代表了搜索后的结果,在methods中声明了onInput和onClear方法,onInput方法会触发更新搜索值并触发搜索结果的更新,onClear方法会清空搜索框。
3.2 vuex的实现
在本例中,搜索框的输入会触发vuex中的action更新搜索结果。在store中实现search和updateSearchValue方法:
// store/search.js
const state = {
searchValue: '',
searchResult: []
};
const mutations = {
updateSearchValue(state, val) {
state.searchValue = val;
},
updateSearchResult(state, result) {
state.searchResult = result;
}
};
const actions = {
search({ commit, state }) {
// ...search logic
commit('updateSearchResult', result);
}
};
export default {
namespaced: true,
state,
mutations,
actions
};
在state中声明了searchValue和searchResult,对应了搜索框的输入和搜索结果。在mutations中声明了updateSearchValue和updateSearchResult方法,分别更新了搜索值和搜索结果。在actions中声明了search方法,触发搜索逻辑,更新搜索结果。
4. uCharts插件的使用
4.1 uSearch组件的实现
uSearch组件需要在template中进行声明。组件中包含了一个uBar图表,用于展示搜索结果的数量和关键字,以及一个输入框,用于进行输入和清空操作。需要传入title和subtitle属性作为图表的标题和副标题,以及opts属性作为图表的配置项:
<template>
<u-Search
:title="chartTitle"
:subtitle="chartSubtitle"
:opts="chartOpts"
:keys="keys">
</u-Search>
</template>
<script>
import uSearch from '@/lib/u-charts/components/u-search.vue';
import { mapState } from 'vuex';
export default {
components: { uSearch },
computed: {
...mapState(['searchResult'])
},
data() {
return {
chartTitle: '搜索结果',
chartSubtitle: '',
chartOpts: {
yAxis: {
minInterval: 1
}
},
keys: []
};
},
watch: {
searchResult(result) {
this.onResult(result);
}
},
methods: {
onResult(result) {
let keys = [];
let data = [];
result.forEach(item => {
keys.push(item.keyword);
data.push(item.count);
});
this.keys = keys;
this.chartOpts.series = [{
type: 'bar',
data
}];
}
}
};
</script>
在computed中声明了searchResult,代表了搜索后的结果,在data中声明了chartTitle、chartSubtitle、chartOpts和keys,分别代表了图表的标题、副标题、配置项和关键字。在watch中监听了searchResult的变化,在onResult方法中从搜索结果中获取关键字和数量,并设置了对应的图表配置项。
4.2 uSearch组件的样式
uSearch组件的样式可以在style中进行自定义。下面是一份样式示例:
.search {
margin-bottom: 20rpx;
.search-input {
display: flex;
align-items: center;
background-color: #fff;
margin: 0 20rpx;
border-radius: 10rpx;
box-shadow: 0 0 5rpx 0 rgba(0,0,0,0.25);
.input-icon {
font-size: 24rpx;
margin-left: 20rpx;
color: #ccc;
}
.input-field {
font-size: 24rpx;
flex: 1;
padding: 20rpx 0;
border: none;
border-radius: 10rpx;
outline: none;
background-color: #fff;
}
.clear-icon {
font-size: 24rpx;
color: #ccc;
}
}
}
.u-search {
display: flex;
flex-direction: column;
align-items: center;
.u-chart {
width: 90%;
height: 400rpx;
margin-top: 20rpx;
background-color: #fff;
border-radius: 10rpx;
box-shadow: 0 0 5rpx 0 rgba(0,0,0,0.25);
}
.u-search-bar {
display: flex;
align-items: center;
justify-content: center;
height: 100rpx;
font-size: 24rpx;
font-weight: bold;
color: #000;
}
}
5. 结语
通过以上步骤的实现,我们可以在uniapp中实现搜索功能,并能够通过uCharts插件对搜索结果进行图表展示。这个实现过程中,我们主要使用了uCharts插件和vuex,让我们在进行数据状态管理和可视化的展示时非常得心应手。希望这篇文章对大家有所帮助。