Javascript 拉维尔7号+;Vue-未定义api-无法在Vue中显示任务发布
我正在vue和Laravel 7中创建一个任务crm,它有一个表单可以上载多个图像。我正处于测试阶段,无法显示我的Javascript 拉维尔7号+;Vue-未定义api-无法在Vue中显示任务发布,javascript,php,vue.js,laravel-7,Javascript,Php,Vue.js,Laravel 7,我正在vue和Laravel 7中创建一个任务crm,它有一个表单可以上载多个图像。我正处于测试阶段,无法显示我的AllTask.vue。我有一个CreateTask.vue表单组件,它按预期显示,但AllTasks.vue组件没有显示。在控制台中,我得到错误信息: Uncaught (in promise) ReferenceError: api is not defined 作为Laravel和Vue的新手,我不清楚如何定义我的api。首先,我让控制器位于controllers文件夹中的A
AllTask.vue
。我有一个CreateTask.vue
表单组件,它按预期显示,但AllTasks.vue
组件没有显示。在控制台中,我得到错误信息:
Uncaught (in promise) ReferenceError: api is not defined
作为Laravel和Vue的新手,我不清楚如何定义我的api。首先,我让控制器位于controllers文件夹中的API文件夹中,并在我的API.php
文件中调用它们,如下所示:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('auth:api')->get('/task', function (Request $request) {
return $request->task();
});
Route::apiResources(['user' => 'API\UserController']);
Route::apiResources(['task' => 'API\TaskController']);
这引发了api not defined错误,因此我在这次调用中注释掉了任务的一部分,并将我的控制器移出api文件夹,移到常规控制器文件夹中
在清除缓存并重新编译应用程序之后,我在控制台中遇到了相同的错误。我完全迷路了,希望有人能给我定位。
以下是我目前掌握的代码:
TaskController.php
public function getAllTasks()
{
$tasks = Task::with('task_images')->orderBy('created_at', 'desc')->get();
return response()->json(['error' => false, 'data' => $tasks]);
}
public function createTask(Request $request)
{
$user = Auth::user();
$task_name = $request->task_name;
$task_priority = $request->task_priority;
$task_assigned_to = $request->task_assigned_to;
$task_assigned_by = $request->task_assigned_by;
$task_description = $request->task_description;
$task_to_be_completed_date = $request->task_to_be_completed_date;
$task_status = $request->task_status;
$task_notes = $request->task_notes;
$task_finished = $request->task_finished;
$task_image_description = $request->task_image_description;
$task_image_id = $request->task_image_id;
$images = $request->images;
$task = Task::create([
'task_name' => $task_name,
'task_priority' => $task_priority,
'task_assigned_to' => $task_assigned_to,
'task_assigned_by' => $task_assigned_by,
'task_description' => $task_description,
'task_to_be_completed_date' => $task_to_be_completed_date,
'task_status' => $task_status,
'task_notes' => $task_notes,
'task_finished' => $task_finished,
'task_image_description' => $task_image_description,
'task_image_id' => $task_image_id,
'user_id' => $user->id,
]);
foreach ($images as $image) {
$imagePath = Storage::disk('uploads')->put($user->id . '/tasks', $image);
TaskImage::create([
'task_image_description' => $task_image_description,
'task_image_path' => '/uploads/' . $imagePath,
'task_id' => $task->id
]);
}
return response()->json(['error' => false, 'data' => $task]);
}
app.js
require("./bootstrap");
window.Vue = require("vue");
import store from "./store/index";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
Vue.use(ElementUI);
import { Form, HasError, AlertError } from "vform";
import moment from "moment";
window.Form = Form;
Vue.component(HasError.name, HasError);
Vue.component(AlertError.name, AlertError);
import VueRouter from "vue-router";
Vue.use(VueRouter);
import VueProgressBar from "vue-progressbar";
Vue.use(VueProgressBar, {
color: "rgb(143, 255, 199)",
failedColor: "red",
height: "6px"
});
import Swal from "sweetalert2";
// const Swal = require('sweetalert2')
window.Swal = Swal;
const toast = Swal.mixin({
toast: true,
position: "top-end",
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
onOpen: toast => {
toast.addEventListener("mouseenter", Swal.stopTimer);
toast.addEventListener("mouseleave", Swal.resumeTimer);
}
});
window.toast = toast;
let routes = [
{
path: "/dashboard",
component: require("./components/Dashboard.vue").default
},
{
path: "/developer",
component: require("./components/Developer.vue").default
},
{
path: "/profile",
component: require("./components/Profile.vue").default
},
{
path: "/users",
component: require("./components/Users.vue").default
},
{
path: "/tasks",
component: require("./components/Tasks.vue").default
}
];
const router = new VueRouter({
mode: "history",
routes
});
Vue.filter("upText", function(text) {
return text.charAt(0).toUpperCase() + text.slice(1);
});
Vue.filter("myDate", function(created_date) {
return moment(created_date).format("MMMM Do YYYY, h:mm:ss a");
});
window.Fire_event = new Vue();
Vue.component(
"example-component",
require("./components/ExampleComponent.vue").default
);
Vue.component(
"dashboard-component",
require("./components/Dashboard.vue").default
);
Vue.component(
"passport-clients",
require("./components/passport/Clients.vue").default
);
Vue.component(
"passport-authorized-clients",
require("./components/passport/AuthorizedClients.vue").default
);
Vue.component(
"passport-personal-access-tokens",
require("./components/passport/PersonalAccessTokens.vue").default
);
Vue.component("create-task", require("./components/CreateTask.vue").default);
Vue.component("all-tasks", require("./components/AllTasks.vue").default);
const app = new Vue({
el: "#app",
router,
store
});
web.php
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('{path}', "HomeController@index")->where('path', '([A-z\d/\/_.]+)?');
Route::group(['middleware' => 'auth', 'prefix' => 'task'], function () {
Route::get('get_all', 'TaskController@getAllTasks')->name('fetch_all');
Route::post('create_task', 'TaskController@createTask')->name('create_task');
});
如果我遗漏了任何内容,或者您希望看到我可能遗漏的更多信息,请让我知道,我将很乐意编辑我的查询。提前感谢您的帮助
编辑
AllTasks.vue
<template>
<div class="row">
<div class="col-md-6" v-for="(task, i) in tasks" :key="i">
<div class="card mt-4">
<img
v-if="task.task_images.length"
class="card-img-top"
:src="task.task_images[0].task_image_path"
alt
/>
<div class="card-body">
<p class="card-text">
<strong>{{ task.task_name }}</strong>
</p>
<br />
{{ truncateText(task.task_description) }}
</div>
<button class="btn btn-success m-2" @click="viewTask(i)">View Task</button>
</div>
</div>
<el-dialog v-if="currentTask" :visible.sync="taskDialogVisible" width="40%">
<span>
<h3>{{ currentTask.task_name }}</h3>
<div class="row">
<div class="col-md-6" v-for="(img, i) in currentTask.task_images" :key="i">
<img :src="img.task_image_path" class="img-thumbnail" alt />
</div>
</div>
<hr />
<h5>Assigned To</h5>
<p>{{ currentTask.task_assigned_to }}</p>
<h5>Assigned By</h5>
<p>{{ currentTask.task_assigned_by }}</p>
<h5>Due</h5>
<p>{{ currentTask.task_to_be_completed_date }}</p>
<h5>Notes</h5>
<p>{{ currentTask.task_notes }}</p>
<h5>Priority</h5>
<p>{{ currentTask.task_priority }}</p>
<h5>Status</h5>
<p>{{ currentTask.task_status }}</p>
</span>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="taskDialogVisible = false">Okay</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapState } from "vuex";
export default {
name: "all-tasks",
data() {
return {
taskDialogVisible: false,
currentTask: "",
};
},
computed: {
...mapState(["tasks"]),
},
beforeMount() {
this.$store.dispatch("getAllTasks");
},
methods: {
truncateText(text) {
if (text.length > 24) {
return `${text.substr(0, 24)}...`;
}
return text;
},
viewTask(taskIndex) {
const task = this.tasks[taskIndex];
this.currentTask = task;
this.taskDialogVisible = true;
},
},
};
</script>
编辑#2
将以下内容添加到bootstrap.js之后
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.api = window.axios;
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
未定义api
错误消失,但替换为:
TypeError: api.task is not a function
我已经隔离了它的位置。在CrateTask.vue中,我有一行:
api.task("/task/create_task", formData, {
headers: { "Content-Type": "multipart/form-data" },
})
问题(我的问题)是我是个笨蛋,不知道如何解决它。再次感谢您的帮助。任务不是axios的一种方法。也许,您需要调用api.get来访问您的laravel控制器路径。在到达此处之前,请务必查找文档
看看文档我猜您是在从AllTasks组件调用API。你介意把那部分也分享一下吗?你好,哈特夫。非常感谢。我已经编辑了这个问题,将AllTasks.vue和resources/js/store/index.js都包括在内。我希望它能揭示我所缺少的东西。干杯。这里:-
api
基本上就是axios
客户端。请确保你的bootstrap.js中有它,在那篇文章的一条评论中,他说他在bootstrap
中设置了它,如下所示:const-api=axios.create({baseURL:'https://some-domain.com/api/,超时:1000,头:{'X-Custom-Header':'foobar'})代码>我强烈建议您开设一门课程,学习您正在学习的技术的基础知识。请记住,在编程中,有时是可行的,但它并不正确。不知道代码的功能可能非常危险。
api.task("/task/create_task", formData, {
headers: { "Content-Type": "multipart/form-data" },
})