Vue 多选与 axios 调用数据库,laravel
Vue multiselect with axios call to database, laravel
出于某种原因,我不太明白如何使用 Vue 获得 'autocomplete' 风格的多选功能。
我正确设置了在我的 axios 块中调用的路由,并且控制器设置为使用查询作为使用 LIKE 子句访问数据库的方式,但是某处出了问题,我的多选是未填充可搜索的数据库结果。
我做错了什么?
路线:
Route::get('search', 'Controller@searchTags')
->name('search');
控制器:
public function searchTags(Request $request)
{
if ($request->get('query')) {
$query = $request->get('query');
$data = TAGS::where('TAG_DATA', 'LIKE', "%{$query}%")->get();
$output = '<ul class="dropdown-menu" style="display:block; position:relative">';
foreach ($data as $row) {
$output .= '<li><a href="#">' . $row->tag_data . '</a></li>';
}
$output .= '</ul>';
return $output;
}
}
Blade:
<div id="tagContent">
<multiselect v-model="value" open-direction="bottom" :options="options" :multiple="true" :close-on-select="false" :taggable="true" :clear-on-select="false" :preserve-search="true" placeholder="Add Tag(s)" label="name" track-by="name">
<template slot="selection" slot-scope="{ values, search, isOpen }"><span class="multiselect__single" v-if="values.length && !isOpen">{{ values.length }} options selected</span></template>
</multiselect>
</div>
new Vue({
components: {
Multiselect: window.VueMultiselect.default
},
data () {
return {
value: [],
options: []
}
},
methods: {
read(){
window.axios.get('campaigns/search').then(({ data }) =>{
console.log(data)
});
},
addTag (newTag) {
const tag = {
name: newTag,
code: newTag.substring(0, 2) + Math.floor((Math.random() * 10000000))
}
this.options.push(tag)
this.value.push(tag)
}
}
}).$mount('#tagContent');
我相信你的示例中缺少一些东西。
您需要在搜索输入更改时触发 read
函数 - 为此使用 @search-change
事件
您需要将 axios 请求的结果发送到 this.options
,以便 multiselect
组件可以使用它们。
在 this example 中,我使用超时模拟了数据请求,但您应该明白了。您还可以利用 loading
属性 让您的用户知道幕后发生的事情。
出于某种原因,我不太明白如何使用 Vue 获得 'autocomplete' 风格的多选功能。
我正确设置了在我的 axios 块中调用的路由,并且控制器设置为使用查询作为使用 LIKE 子句访问数据库的方式,但是某处出了问题,我的多选是未填充可搜索的数据库结果。
我做错了什么?
路线:
Route::get('search', 'Controller@searchTags')
->name('search');
控制器:
public function searchTags(Request $request)
{
if ($request->get('query')) {
$query = $request->get('query');
$data = TAGS::where('TAG_DATA', 'LIKE', "%{$query}%")->get();
$output = '<ul class="dropdown-menu" style="display:block; position:relative">';
foreach ($data as $row) {
$output .= '<li><a href="#">' . $row->tag_data . '</a></li>';
}
$output .= '</ul>';
return $output;
}
}
Blade:
<div id="tagContent">
<multiselect v-model="value" open-direction="bottom" :options="options" :multiple="true" :close-on-select="false" :taggable="true" :clear-on-select="false" :preserve-search="true" placeholder="Add Tag(s)" label="name" track-by="name">
<template slot="selection" slot-scope="{ values, search, isOpen }"><span class="multiselect__single" v-if="values.length && !isOpen">{{ values.length }} options selected</span></template>
</multiselect>
</div>
new Vue({
components: {
Multiselect: window.VueMultiselect.default
},
data () {
return {
value: [],
options: []
}
},
methods: {
read(){
window.axios.get('campaigns/search').then(({ data }) =>{
console.log(data)
});
},
addTag (newTag) {
const tag = {
name: newTag,
code: newTag.substring(0, 2) + Math.floor((Math.random() * 10000000))
}
this.options.push(tag)
this.value.push(tag)
}
}
}).$mount('#tagContent');
我相信你的示例中缺少一些东西。
您需要在搜索输入更改时触发
read
函数 - 为此使用@search-change
事件您需要将 axios 请求的结果发送到
this.options
,以便multiselect
组件可以使用它们。
在 this example 中,我使用超时模拟了数据请求,但您应该明白了。您还可以利用 loading
属性 让您的用户知道幕后发生的事情。