javascript - 通过 Vuejs 和 axios 向 laravel 后端提交 post 请求

标签 javascript ajax laravel vue.js

我需要一些帮助来通过 vue 向我的 laravel 后端实现一个基本的 ajax 请求,我在一个名为 courses 的表上有一个名为 completed 的 bool 值,我有一个 View 可以获取分配给特定用户的所有类(class)并允许他们按下一个按钮来改变类(class)的当前状态,完成与否,就是这样,这就是我想做的,现在我可以通过获取和发布请求正常完成,显然会导致页面刷新,我希望仅通过刷新 dom 即可实现动态,我感到非常沮丧,以至于我自己无法解决这个问题,因为我认为这应该很容易,结果我对使用 vuejs 一无所知。

这是我的 CoursesController 的重要部分:

  public function toggling($name)
      {
        $course = Course::where(['name' => $name])->first();

        $course->completed = !$course->completed;
        $course->save();

        // return redirect()->back();
        return response()->json(['course' => $course], 202);
        }

这是向用户提供类(class)的 View 的重要部分,它是表格的一部分:

    <td>
     <form method="POST" @submit.prevent="onSubmit" action="{{ route('course.completed', $course->name) }}" id="form-submit">
         {{-- {{ method_field('PUT') }} --}}
        {{ csrf_field() }}
       @if ($course->completed == true)
       <button type="submit" class="btn btn-sm" id="coursetogglingtrue">Done!</button>
        @else
      <button type="submit" class="btn btn-sm" id="coursetogglingfalse">Not Yet!</button>
        @endif

      </form>
   </td>

由于某种原因,@submit.prevent 方法不起作用,它起作用了几次,但后来就不起作用了,表单继续像往常一样提交。

这些是 app.blade.php 中的脚本,我不知道我应该如何/在哪里编译它,它只是坐在我项目的主要布局中,我应该将它转移到 public/js/app 吗?杰斯?或者使用 gulp 编译它?如果您有任何想法,请告诉我:

<!-- Scripts -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://unpkg.com/vue@2.1.10/dist/vue.js"></script>
<script src="/js/app.js"></script>
<script>
  new Vue({
      el: '#app',
      data: {
        course: {}
      },
      methods: {
        onSubmit() {
          // course = $event.target;
          axios.post('/MyCourses/{{course.name}}').then(console.log(course));
        }
      }
  });
</script>

我想让 course 等于请求的任何值,这样我就可以将提交的类(class)名称的值作为目标,并将其注入(inject)到我正在尝试做的路由中,但是我不确定该怎么做,我尝试了一些不同的事情,但都失败了。 这是 routes/api.php

Route::post('/MyCourses/{name}', 'CoursesController@toggling')->name('course.completed');

ofc 现在这是行不通的,表单正在提交,我被重定向到一条路线,在那里我得到了 json 响应,仅此而已,我只想刷新 dom,这样按钮就会有新 id 取决于类(class)的状态,类(class)本身将在后台更新和保存而不刷新页面。 我对此很陌生,我知道该表格可能应该重写,而且我知道我犯了很多错误,但我只是希望它能正常工作,因此非常感谢您的帮助。

更新

经过大量的试验和错误,我完成了 ajax 部分,我几乎完成了其余部分我只需要做一些事情,这就是我到目前为止所做的,

在 View 中:

  <form method="POST" @click.prevent="onSubmit" action="{{ route('course.completed', $course->name) }}" id="form-submit">
                       {{ csrf_field() }}
     @if ($course->completed == true)
     <button type="button" class="btn btn-sm" id="coursetogglingtrue">Done!</button>
     @else
     <button type="button" class="btn btn-sm" id="coursetogglingfalse">Not Yet!</button>
     @endif

将按钮的类型从提交更改为按钮允许 .prevent 方法实际触发,现在表单不再提交,表单仍然需要工作以便根据类(class)的状态输出正确的类但无论如何,

这是我现在的脚本:

<script>
  new Vue({
      el: '#app',
      data: {
        course: {
          name: '',
          bool: false
        }
      },
      methods: {
        onSubmit: function() {
          this.course.bool = !this.course.bool,
          axios.post('/MyCourses/{{$course->name}}')
               .then(function (response){
                  // {{$course->completed}} = response.course.completed;
               });
        }
      }
  });
</script>

现在不知何故,我实际上正在将发布请求发送到正确的路由,但是现在有一个优先级最高的问题,$course 正在引用添加到页面的最新类(class),而不是类(class)我通过按下按钮选择的,现在无论我按下哪个按钮,最后一个类(class)都会被注入(inject)到 $course,然后是 axois 中的路线,我还不知道如何解决这个问题,但到目前为止那个类(class)得到更新,如果我检查 chrome 中的网络选项卡,我会看到响应并且已完成列的值得到更新,我相信代码中仍然存在一些错误,但我会继续尝试,如果你能指出还有一些事情请告诉我,谢谢

最佳答案

对上述答案的改进是使用 ES6 中引入的模板文字。

代替:

axios.post('/MyCourses/' + course.name).then(console.log(course));

你可以这样做:

axios.post(`/MyCourses/${course.name}`).then(console.log(course));

可在此处找到有关模板文字功能和语法的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

关于javascript - 通过 Vuejs 和 axios 向 laravel 后端提交 post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42276661/

相关文章:

javascript - 在客户端完成并行、异步调用后执行操作

javascript - 无法使用 'in' 运算符在 null 中搜索 'error'

javascript - Jquery 更改表 th 标签无法正常工作

javascript - jQuery JSON 解析 - 对象元素

php - 创建规则使请求仅包含某些键

php - Laravel htaccess,将特定 URL 重定向到其他文件夹

javascript - 当我将react router与webpack一起使用时,它显示错误 "React.createElement: type is invalid"

php - symfony 响应与 json ajax

java - PHP 客户端如何通过 Sockets/RPC 与 Java 程序通信,在不刷新页面的情况下检索新结果?

php - 如何使用 LARAVEL 将抓取的数据发送到 Mysql 表