Vue-Select: перемещение 2-мерного массива в: параметры
Плагин Vue-Select.
То, что я пытался сделать, это сделать поиск-выбор-выпадающий ввод на основе базы данных.
Итак, вот мой SQL- файл с именем Ms_Location.
id_Loc | name_Loc
LOC0001 | Indonesia
LOC0002 | China
LOC0003 | America
Мой index.php
<!DOCTYPE html>
<html>
<head>
</head
<body>
<div class="form-group">
<label for="lokasi_id" class="control-label required"><strong>Lokasi</strong></label>
<v-select :options="lokasi_list" placeholder='Type location..'></v-select>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script src="https://unpkg.com/vue-select@latest"></script>
Vue.component('v-select', VueSelect.VueSelect);
var app = new Vue ({
el: '#app',
data: {
lokasi_select: '',
lokasi_list: [],
},
// End of data
computed: {
get_lokasi() {
var list_loc = new Array();
list_loc = <?php include('receive_lokasi.php') ?>;
for(var i=0; i<list_loc.length; i++) {
var pushLoc = {
label: list_loc[i][1], value: list_loc[i][0]
}
this.lokasi_list.push(pushLoc);
}
return list_loc[0][1];
}
}
})
});
</script>
</body>
</html>
И это мой receive_lokasi.php
<?php
include ('koneksi.php');
$condition = "1";
if(isset($_GET['userid'])){
$condition = " id=".$_GET['userid'];
}
$sqltran = mysqli_query($con, "SELECT id_Loc, name_Loc FROM ms_location")or die(mysqli_error($con));
$response = array();
while ($rowList = mysqli_fetch_array($sqltran,MYSQLI_NUM)) {
$response[] = $rowList;
}
echo json_encode($response);
mysqli_close($con);
?>
Тем не менее, я не могу показать вариант. Это происходит только после того, как я сделаю get_lokasi(). Значит ошибка, наверное, есть? Или, может быть, я что-то упустил.
Я пытался где-то напечатать lokasi_list, и да, значение есть, но не отображается в выпадающем меню.
Кроме того, я новичок в Vue, поэтому любая помощь будет хорошей. Спасибо!
2 ответа
Не берите в голову..
Моя ошибка, я не заметил receive_lokasi.php
код
Вместо использования MYSQLI_NUM
while ($rowList = mysqli_fetch_array($sqltran,MYSQLI_NUM)) {
$response[] = $rowList;
}
Я должен использовать MYSQLI_ASSOC, как описано здесь.
while ($rowList = mysqli_fetch_array($sqltran,**MYSQLI_ASSOC**)) {
$response[] = $rowList;
}
После этого измени это
<v-select :options="lokasi_list" placeholder='Type location..'></v-select>
К этому
<v-select label='nama_Location' :options="lokasi_list" placeholder='Type location..'></v-select>
После этого все загружается нормально.
Вычисляемые свойства Vue обычно не используются для заполнения атрибутов данных VUE, они обычно принимают один или несколько атрибутов данных и объединяют их в нечто иное для использования шаблоном.
В своем коде вы пытались заполнить атрибут данных vue "lokasi_list" в вычисляемом свойстве "get_lokasi", но вы никогда не вызываете "get_lokasi" где-либо в шаблоне, поэтому lokasi_list остается пустым.
Другой подход к такого рода ситуации заключается в использовании метода vue для извлечения данных из бэкэнда php с помощью вызова ajax с чем-то вроде axios, и вы обычно используете этот метод в событии жизненного цикла приложения vue, чтобы получить данные как можно скорее.,
например
<script>
Vue.component('v-select', VueSelect.VueSelect);
var app = new Vue({
el: '#app',
data: {
lokasi_select: '',
lokasi_list: [],
},
created: function() {
this.fetchLocations();
},
methods: {
fetchLocations: function() {
axios.get('/api/locations-end-point')
.then((response) => {
this.lokasi_list = response.data //might need to change this to match how your php is returning the json
})
.catch((error) => {
//handle the error
})
}
}
});
</script>
Извините, что упомянул об этом, но в вашем php вы получили:
if(isset($_GET['userid'])){
$condition = " id=".$_GET['userid'];
}
Похоже, вы планировали использовать его как часть вашего sql, но он был бы уязвим для атак SQL-инъекций, извините, если я укажу на то, что вы уже знали.