【发布时间】:2021-06-30 21:12:07
【问题描述】:
我正在尝试学习 Vue.js。我正在构建一个非常小的组件。该组件实际上只是一个使用 select 的选项列表。在文档或我可以在网上找到的任何教程中,都没有显示如何将数据从数据库加载到 Vue 组件中。我找到了一些使用 Axios 的示例,但我对使用 Axios 完全没有兴趣。我只是想了解 Vue 是如何工作的,这样我就可以看看是否可以使用它来改进我的工作流程。这实际上是一个基本的测试用例。此外,此代码引用的 PHP 部分工作正常。我已经直接测试过了,它加载的数据完全符合预期。
这里是javascript部分。
const cityChoice = {
data() {
return {
citys: [
{ Abbrev: 'Lima' },
{ Abbrev: 'FtWayne' },
],
err: false
}
},
methods: {
},
mounted() {
fetch('Controller/get_cities.php', {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
headers: {
// 'Content-Type': 'application/json'
'Content-Type': 'application/x-www-form-urlencoded',
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: '' // body data type must match "Content-Type" header
}).then(function (response) {
return response.text();
}).then(function (data) {
testData = data
return testData;
});
},
methods: {
getCities() {
fetch('Controller/get_cities.php', {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
headers: {
// 'Content-Type': 'application/json'
'Content-Type': 'application/x-www-form-urlencoded',
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: '' // body data type must match "Content-Type" header
}).then(function (response) {
return response.text();
}).then(function (data) {
this.citys = data;
alert(this.citys)
});
this.citys = [
{ Abbrev: 'Dayton' },
{ Abbrev: 'Cincy' },
]
}
}
}
Vue.createApp(cityChoice).mount('#cityChoice')
这里是 HTML 部分。
<?php
$lifetime = 60 * 60 * 24 * 14;
session_set_cookie_params($lifetime, '/');
session_start();
include 'Controller/login_check.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/vue@next"></script>
<title>BAI Inventory Entry</title>
</head>
<body>
<div id="cityChoice">
<select id="city">
<option v-for="city in citys">
{{ city.Abbrev }}
</option>
</select>
<button v-on:click="getCities">Get Cities</button>
</div>
</body>
<script src="js/global.js?ver3"></script>
</html>
我很肯定我只是不了解这种软件语言的工作原理。但是,我需要了解它是如何调用真实数据的,否则我将永远无法围绕它的其他基础知识进行思考,因为我经常发现自己在问“为什么这比仅仅编码更好” javascript”。我正在尝试了解如何使这个简单的示例发挥作用,以便我能够克服脑海中的那个问题并继续学习这门语言。
我已经尝试过使用“mounted”和“created”来加载 getCities 方法,同时将城市的数据部分设置为“”。还是没有骰子。当使用数组和/或 JSON 数据对城市进行硬编码时,它会完全按预期加载。
更新:我已将代码调整为现在在 javascript 部分中显示的内容。使用 chrome 工具,我可以看到我的城市变量充满了 JSON 对象数组,但我仍然没有将任何数据放入 Select 列表中。我完全不知道为什么这不起作用,以及为什么这似乎很难做到。而且...这实际上只是将几个城市加载到下拉列表中的代码。
更新 2:显然 Vue 不允许从 Fetch 内部更新项目。我已经更新了代码以显示我的测试。我的 API 可以正常返回数据,并且我已经多次验证。我已经尝试在最终的 fetch .then 部分中对 this.citys 进行硬编码,但它不起作用。但是,当我在 fetch 之外对其进行硬编码时(如上面的代码所示),它可以正常工作。我到了不得不假设这是 Vue 的限制的地步,这对我来说似乎很疯狂。我在 Stackoverflow 上发现了另一个有同样问题的问题,但答案实际上只是告诉他完全按照我上面一直在尝试做的事情去做。而且,我无法评论询问他是否找到了解决方案,因为我没有足够的声誉。
【问题讨论】:
-
我认为你只需要在
fetch之前添加一个回报 -
你缺少一个结尾
</select>标签 -
我之前的回答不正确,我没有意识到您正在尝试将其添加到页面中。但是如果您从头开始并想使用 php 作为您的 api
nuxt是一个不错的解决方案 -
我对使用 nuxt 不感兴趣。我只是想提高我的技能,这样我就可以改进我的简历。我维护了几个用 vanilla JS 构建的复杂文件,但每次我尝试选择其中一个框架时,我都会感到沮丧,因为没有任何文档或教程提供有关如何使用真实数据库和 PHP 后端的任何信息。我在认真地质疑为什么像 Vue 和 React 这样的东西被如此推崇。上面的代码需要我 15 到 20 行 javascript 代码才能完全完成。