成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

本篇文章給大家分享一個Vue+Laravel開發教程,介紹一下怎么使用 Vue.js 和 Laravel 共建一個簡單的 CRUD 應用,希望對大家有所幫助!

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

CURD (增刪改查)是數據存儲的基本操作,也是你作為 Laravel 開發人員首先要學習的內容之一

但是,如果要結合以 Vue.js 作為前端的應用程序該注意哪些問題呢?首先,因為現在的操作不刷新頁面,所以你需要異步 CURD 。因此,你需要確保數據在前后端的一致性。(學習視頻分享:vuejs教程)

在本教程中,我會演示如何開發完整的 Laravel&Vue.js 應用程序和每個 CURD 的例子。 AJAX 是連接前后端的關鍵,所以,我會使用 Axios 作為 HTTP 客戶端。我還將向您展示一些處理這種體系結構的用戶體驗方面缺陷的方法。

你可以在 GitHub 中查看完整的項目。

https://github.com/anthonygore/vue-laravel-crud

演示 app

這是一個讓使用者創建一個 “Cruds“ 的全棧應用,當我進入這個應用時,它會創造很多不可思議的東西。外星人獨特的名稱和可以在紅色,綠色和黑色的自由轉換。

Cruds 應用展示在主頁,你可以通過 add 按鈕添加 Cruds , delete 按鈕刪除它們,或者更新它們的顏色。

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

Laravel 后端的 CRUD

我們將使用 Laravel 后端開始本教程,來完成 CRUD 操作。我將保持這一部分簡短,因為 Laravel 的 CRUD 是其他地方廣泛涉及的主題.

總之,我們完成以下操作

  • 設置數據庫
  • 通過資源控制器來編寫一個 RESTful API 的路由
  • 在控制器中定義方法,來完成 CRUD 操作

Database

首先是遷移,我們的 Cruds 有兩個屬性:名稱和顏色,我們將其設置為 text 類型

2018_02_02_081739_create_cruds_table.php

<?php  ...  class CreateCrudsTable extends Migration {   public function up()   {     Schema::create('cruds', function (Blueprint $table) {       $table->increments('id');       $table->text('name');       $table->text('color');       $table->timestamps();     });   }    ... } ...

API

現在我們來設置 RESTful API 路由. 這個 resource 方法將自動創建我們所需要的所有操作. 但是, 我們不需要 edit, showstore 這幾個路由,因此我們需要排除它們.

routes/api.php

<?php  Route::resource('/cruds', 'CrudsController', [   'except' => ['edit', 'show', 'store'] ]);

有了這些, 我們現在可以在API中使用以下路由:

HTTP 方法 地址 方法 路由名
GET /api/cruds index cruds.index
GET /api/cruds/create create cruds.create
PUT /api/cruds/{id} update cruds.update
DELETE /api/cruds/{id} destroy cruds.destroy

控制器

我們現在需要在控制器中實現這些操作:

app/Http/Controllers/CrudsController.php

<?php  namespace AppHttpControllers;  use AppCrud; use IlluminateHttpRequest; use IlluminateHttpResponse; use FakerGenerator;  class CrudsController extends Controller {   // Methods }

我們先簡要概述下每種方法:

create 方法。我們使用 Laravel 附帶的 Faker 包,為 Crud 隨機生成名稱和顏色字段 。隨后,我們將新生成的數據作為 JSON 返回。

<?php  ...  public function create(Generator $faker) {   $crud = new Crud();   $crud->name = $faker->lexify('????????');   $crud->color = $faker->boolean ? 'red' : 'green';   $crud->save();    return response($crud->jsonSerialize(), Response::HTTP_CREATED); }

index方法。我們使用 index 方法返回 Cruds 的全部數據。在一個更嚴肅的應用中,我們會使用分頁,但是現在我們盡量保持簡潔。

<?php  ...  public function index() {   return response(Crud::all()->jsonSerialize(), Response::HTTP_OK); }

update。此方法允許客戶端更改 Crud 的顏色。

<?php  ...  public function update(Request $request, $id) {   $crud = Crud::findOrFail($id);   $crud->color = $request->color;   $crud->save();    return response(null, Response::HTTP_OK); }

destroy。 刪除 Cruds 的方法。

<?php  ...  public function destroy($id) {   Crud::destroy($id);    return response(null, Response::HTTP_OK); }

Vue.js 應用

現在開始處理 Vue 頁面展示部分。先來創建一個組件 — CrudComponent.vue,用來展示 Cruds 的內容。

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

這個組件主要是展示的功能,沒有太多的業務邏輯。主要有以下幾個重點:

  • 展示一張圖片,圖片的顏色取決于 Crud 的顏色( 也就是展示 red.png 還是 green.png)
  • 有一個刪除按鈕,當點擊時會觸發 del 方法,繼而觸發一個 delete 事件,并攜帶當前 Crud 的 ID 作為參數
  • 有一個 HTML 選擇器 ( 用來選擇顏色 ),當發生選擇時,會觸發 update 方法,繼而觸發一個 update 事件,并攜帶當前 Crud 的 ID 和新選擇的顏色作為參數

resources/assets/js/components/CrudComponent.vue

<template>   <p class="crud">     <p class="col-1">       <img :src="image"/>     </p>     <p class="col-2">       <h3>Name: {{ name | properCase }}</h3>       <select @change="update">         <option           v-for="col in [ 'red', 'green' ]"           :value="col"           :key="col"           :selected="col === color ? 'selected' : ''"         >{{ col | properCase }}</option>       </select>       <button @click="del">Delete</button>     </p>   </p> </template> <script>   export default {     computed: {       image() {         return `/images/${this.color}.png`;       }     },     methods: {       update(val) {         this.$emit('update', this.id, val.target.selectedOptions[0].value);       },       del() {         this.$emit('delete', this.id);       }     },     props: ['id', 'color', 'name'],     filters: {       properCase(string) {         return string.charAt(0).toUpperCase() + string.slice(1);       }     }   } </script> <style>...</style>

在這個項目中還有一個組件 App.vue。它在整個項目中的地位非常重要,所有主要的邏輯都寫在這里。下面就來逐步分析這個文件。

先從 template 標簽開始, 它主要處理了下面這些業務:

  • 為我們上面提到的 crud-component 組件占位
  • 遍歷包含 Crud 對象的數組(也就是 cruds 數組 ),數組中的每個元素都對應著一個 crud-component 組件。我們以 props 的形式把每個 Crud 的屬性傳遞給這個組件,并且監聽來自這個組件的 updatedelete 事件
  • 設置一個 Add 按鈕,當點擊時,會觸發 create 方法,從而創建新的 Cruds

resources/assets/js/components/App.vue

<template>   <p id="app">     <p class="heading">       <h1>Cruds</h1>     </p>     <crud-component       v-for="crud in cruds"       v-bind="crud"       :key="crud.id"       @update="update"       @delete="del"     ></crud-component>     <p>       <button @click="create()">Add</button>     </p>   </p> </template>

下面來看 App.js 文件的 script 部分:

  • 首先通過 Crud 函數創建用于展示 Cruds 的對象, 包括 ID, 顏色和姓名
  • 然后, 引入 CrudComponent 組件
  • 組件的 cruds 數組作為 data 的屬性。 關于對 CRUD 的增刪改查的具體操作, 會在下一步展開說明。

resources/assets/js/components/App.vue

<template>...</template> <script>   function Crud({ id, color, name}) {     this.id = id;     this.color = color;     this.name = name;   }    import CrudComponent from './CrudComponent.vue';    export default {     data() {       return {         cruds: []       }     },     methods: {       create() {         // 待完善       },       read() {         // 待完善       },       update(id, color) {         // 待完善       },       del(id) {         // 待完善       }     },     components: {       CrudComponent     }   } </script>

前端通過 AJAX 觸發 CURD

在一個完整的項目中,所有的 CRUD 操作都是在后端完成的,因為數據庫是跟后端交互的。然而,觸發 CRUD 的操作幾乎都是在前端完成的。

因此,一個 HTTP 客戶端(也就是負責在前后端之間交互數據的橋梁)的作用是非常重要的。被 Laravel 前端默認封裝的 Axios, 就是一個非常好用的 HTTP 客戶端。

再來看下資源表,每個 AJAX 請求都需要有一個明確的 API 接口:

Verb Path Action Route Name
GET /api/cruds index cruds.index
GET /api/cruds/create create cruds.create
PUT /api/cruds/{id} update cruds.update
DELETE /api/cruds/{id} destroy cruds.destroy

Read

首先來看 read 方法。這個方法是負責在前端發起 Cruds 請求的,對應后端的處理在是控制器里的 index 方法,因此使用 GET 請求 /api/cruds。

由于 Laravel 前端默認把 Axios 設置為 window 的一個屬性, 因此我們可以使用 window.axios.get 來發起一個 GET 請求。

對于像 get, post 等 Axios 方法的返回結果,我們可以再繼續鏈式調用 then 方法,在 then 方法里可以獲取到 AJAX 響應數據的主體 data 屬性。

resources/assets/js/components/App.vue

...  methods() {   read() {     window.axios.get('/api/cruds').then(({ data }) => {       // console.log(data)     });   },   ... }  /* Sample response:  [   {     "id": 0,     "name": "ijjpfodc",     "color": "green",     "created_at": "2018-02-02 09:15:24",     "updated_at": "2018-02-02 09:24:12"   },   {     "id": 1,     "name": "wjwxecrf",     "color": "red",     "created_at": "2018-02-03 09:26:31",     "updated_at": "2018-02-03 09:26:31"   } ] */

從上面的返回結果可以看出,返回的結果是 JSON 數組。Axios 會自動將其解析并轉成 JavaScript 對象返給我們。這樣方便我們在回調函數里對結果進行遍歷,并通過 Crud 工廠方法創建新的 Cruds,并存到 data 屬性的 cruds 數組中,例如 this.cruds.push(...)。

resources/assets/js/components/App.vue

...  methods() {   read() {     window.axios.get('/api/cruds').then(({ data }) => {       data.forEach(crud => {         this.cruds.push(new Crud(crud));       });     });   }, }, ... created() {   this.read(); }

注意:我們通過 created 方法,可以使程序在剛一加載時就觸發 read 方法,但這并非最佳實踐。最好方案應該是直接去掉 read 方法,當程序第一次加載的時候,就把應用的初始狀態都包含在文檔投中。

通過上面的步驟,我們就能看到 Cruds 展示在界面上了:

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

更新 (以及狀態同步)

執行 update 方法需要發送表單數據,比如 color,這樣控制器才知道要更新哪些數據。Crud 的 ID 是從服務端獲取的。

還記得我在本文開篇就提到關于前后端數據一致的問題,這里就是一個很好的例子。

當需要執行 update 方法時,我們可以不用等待服務器返回結果,就在前端更新 Crud 對象,因為我們很清楚更新后應該是什么狀態。

但是,我們不應該這么做。為什么?因為有很多原因可能會導致更新數據的請求失敗,比如網絡突然中斷,或者更新的值被數據庫拒絕等。

所以等待服務器返回更新成功的信息后,再刷新前端的狀態是非常重要的,這樣我們才能確保前后端數據的一致。

resources/assets/js/components/App.vue

methods: {   read() {     ...   },   update(id, color) {     window.axios.put(`/api/cruds/${id}`, { color }).then(() => {       // 一旦請求成功,就更新 Crud 的顏色       this.cruds.find(crud => crud.id === id).color = color;     });   },   ... }

你可能會說這樣非必要的等待會影響用戶體驗,但是我想說,我們在不確定的情況下更新狀態,誤導用戶,這應該會造成更差的用戶體驗。

創建和刪除

現在你已經明白整個架構的關鍵點了,剩下兩個方法,不需要我解釋,你也應該能夠理解其中的邏輯了:

resources/assets/js/components/App.vue

methods: {   read() {     ...   },   update(id, color) {     ...   },   create() {     window.axios.get('/api/cruds/create').then(({ data }) => {       this.cruds.push(new Crud(data));     });   },   del(id) {     window.axios.delete(`/api/cruds/${id}`).then(() => {       let index = this.cruds.findIndex(crud => crud.id === id);       this.cruds.splice(index, 1);     });   } }

加載界面 和 禁止互動


你應該知道,我們這個項目VUE前端的CRUD操作都是異步方式的,所以前端AJAX請求服務器并等待服務器響應返回響應,總會有一點延遲。因為用戶不知道網站在做什么,此空檔期用戶的體驗不是很好,這學問關聯到UX。

為了改善這UX問題,因此最好添加上一些加載界面并在等待當前操作解決時禁用任何交互。這可以讓用戶知道網站在做了什么,而且可以確保數據的狀態。

Vuejs有很多很好的插件能完成這個功能,但是在此為了讓學者更好的理解,做一些簡單的快速的邏輯來完成這個功能,我將創建一個半透明的p,在AJAX操作過程中覆蓋整個屏幕,這個邏輯能完成兩個功能:加載界面和禁止互動。一石兩鳥,完美~

resources/views/index.blade.php

<body> <p id="mute"></p> <p id="app"></p> <script src="js/app.js"></script> </body>

當進行 AJAX 請求的時候,就把 mute 的值從 false 改為 true, 通過這個值的變化,控制半透明 p 的顯示或隱藏。

resources/assets/js/components/App.vue

export default {   data() {     return {       cruds: [],       mute: false     }   },   ... }

下面就是在 update 方法中切換 mute 值的過程。當執行 update 方法時,mute 值被設為 true。當請求成功,再把 mute 值設為 false, 這樣用戶就可以繼續操作應用了。

resources/assets/js/components/App.vue

update(id, color) {   this.mute = true;   window.axios.put(`/api/cruds/${id}`, { color }).then(() => {     this.cruds.find(crud => crud.id === id).color = color;     this.mute = false;   }); },

在 CRUDE 的每個方法里都要有這樣的操作,在此,為了節約篇幅,我就不一一寫明了。

為了保證大家不會忘記這個重要的操作,我們直接在 <p id="app"></p> 元素上方增加了 <p id="mute"></p> 元素。

從下面的代碼可以看到,當 <p id="mute"> 元素被加上 class on 后,它將以灰色調完全覆蓋整個應用,并阻止所有的點擊事件:

resources/views/index.blade.php

<!doctype html> <html lang="{{ app()->getLocale() }}"> <head>   <meta charset="utf-8">   <meta http-equiv="X-UA-Compatible" content="IE=edge">   <meta name="viewport" content="width=device-width, initial-scale=1">   <meta name="csrf-token" content="{{ csrf_token() }}">   <title>Cruds</title>   <style>     html, body {       margin: 0;       padding: 0;,       height: 100%;       width: 100%;       background-color: #d1d1d1     }     #mute {       position: absolute;     }     #mute.on {       opacity: 0.7;       z-index: 1000;       background: white;       height: 100%;       width: 100%;     }   </style> </head> <body> <p id="mute"></p> <p id="app"></p> <script src="js/app.js"></script> </body> </html>

最后一個問題是對于 on class 的管理,我們可以在 mute 的值上加一個 watch,每當 mute 的值發生改變的時候,就加上或刪除 on class:

export default {   ...   watch: {     mute(val) {       document.getElementById('mute').className = val ? "on" : "";     }   } }

完成上面所有的步驟,你就可以擁有一個帶有加載指示器的全棧Vue / Laravel CRUD 的應用程序了。再來看下完整效果吧:

手把手帶你使用Vue + Laravel開發一個簡單的 CRUD 應用

你可以從 GitHub 獲取代碼,如果有任何問題或者想法,歡迎給我留言!

英文原文地址:https://vuejsdevelopers.com/2018/02/05/vue-laravel-crud/

譯文地址:https://learnku.com/vuejs/t/24724

(學習視頻分享:web前端開發、編程入門)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
视频一区二区三区在线观看密桃| 日韩精品少妇无码受不了| 欧美人C交ZOOZOOXX| 人妻被修空调在夫面侵犯| 色偷偷AV男人的天堂| 无码中文AV有码中文AV| 亚洲国产成人AV网站| 在线播放无码高潮的视频| 99精品人妻少妇一区二区| 成人AV天堂一二三在线观看| 国产精品久久久久JK制服 | 美女把尿口扒开让男人桶爽| 欧美极品少妇XXXXⅩ另类| 色综合久久蜜芽国产精品| 小浪货腿打开水真多真紧| 亚洲欧美日韩中文字幕在线一区 | 日韩精品人妻无码久久影院| 西西大胆无码视频免费| 亚洲综合久久精品无码色欲| EEUSS影院在线观看| 国产精品国产三级国产A| 精品无码一区二区三区不卡| 欧美成人V片观看| 天码AV高清毛片在线看_| 亚洲国产精品无码AV| 400部精品国偷自产在线| 国产AV无码区亚洲AV欧美| 极品少妇被猛得白浆直流草莓视频 | 日韩精品一区二区三区四区蜜桃| 亚洲AV成人一区二区三区在线观 | 人妻系列AV无码专区| 新CHINESE无套小帅KTV| 孕妇泬出白浆18P| 干了老婆闺蜜两个小时| 久久精品道一区二区三区| 人妻无码久久精品人妻| 亚洲AV永久无码精品成人| 99久久免费国产精品| 国产麻豆天美果冻无码视频| 另类极品VPSWINDOWS| 色综合精品无码一区二区三区 | 可以C女性角色的游戏手游| 日韩人妻一区二区三区免费 | 丁香五月婷婷色人阁TP精品| 精品日韩欧美一区二区在线播放| 欧美人与禽2O2O性论交| 亚洲AV无码专区色爱天堂老鸭窝 | 欧美黑人疯狂性受XXXXX喷水| 无码成人一区二区| 51无码人妻精品1国产| 国产精品无码一本二本三本色| 乱码一线二线三线新区破解版| 唐人社视频呦一区二区| 中中文日产幕无线码一区| 国产精品美女乱子伦高潮| 内射中出日韩无国产剧情| 小S货又想挨C了叫大声点| 7777色鬼XXXX欧美色妇| 国产真实伦在线观看| 欧洲美女粗暴交视频| 亚洲精品无码成人| 东北少妇大叫高潮XXXⅩ| 巨爆乳无码视频在线观看| 我的娇妻QUEEN| BBOX撕裂BASS俄罗斯| 精品多毛少妇人妻AV免费久久| 日本强伦姧熟睡人妻完整视频| 亚洲日产韩国一二三四区| 给个网站2021年直接进入的| 免费看片A级毛片免费看| 亚洲AV无码乱码在线观看裸奔 | 亚洲 A V无 码免 费 成| А√天堂中文最新版在线下载种子| 精品国产AⅤ一区二区三区| 少妇被 到高潮喷出白浆av| 2021国产麻豆剧传媒网站| 极品人妻VIDEOSSS人妻| 四虎永久在线精品国产馆V视影院| 最新版天堂中文在线官网| 精品人伦一区二区三区潘金莲| 天天槽夜夜槽槽不停| А天堂中文在线官网| 六十路垂乳熟年交尾| 亚洲国产精品无码一区二区三区| 丰满人妻中伦妇伦精品APP| 末发育娇小性色XXXX| 亚洲精品无码精品MV在线观看| 国产成人无码AⅤ片在线观看导航| 欧美人与动性XXXXX交性| 伊人久久大香线蕉AⅤ色| 国精产品 自偷自偷| 熟女高潮精品一区二区绯乐| WWW夜片内射视频日韩精品成人| 久久香综合精品久久伊人| 亚洲JIZZJIZZ中国少妇| 国产精品看高国产精品不卡| 日本熟妇色XXXXX日本免费看| 97大学生情侣真实露脸在线| 久久国产精品成人影院| 亚洲AV日韩综合一区尤物| 国产成人亚洲精品无码影院BT| 日产精品一区二区| YOUJIZZ中国熟女| 欧美成人激情视频| 中文字幕女人妻热女人妻| 久久久WWW成人免费毛片| 亚洲ΑV无码一区二区三区四区| 国产成人猛男69精品视频| 色欲天天天天天综合网| 成人丝袜激情一区二区| 人物动物交互狗AA| YY8090韩国理伦片在线| 欧美日韩人妻精品一区在线| 18禁裸乳无遮挡免费网站| 蜜桃视频在线观看| 中文精品久久久久国产网址| 老汉引诱新婚少妇| 在线麻豆精东9制片厂AV影现网 | 最新国产精品亚洲| 蜜桃传媒在线观看免费版7| 夜里十大禁用APP软件最新章节| 久久精品99国产精品蜜桃| 亚洲日韩亚洲另类激情文学一| 精品久久久99大香线蕉| 亚洲成A人片在线观看中文| 狠狠色噜噜狠狠狠8888米奇| 亚洲AV永久精品无码| 极品人妻VIDEOSSS人妻| 亚洲精品无码专区久久| 久久成人亚洲香蕉草草| 一本一道AV无码中文字幕麻豆 | 曰韩一区二区三区视频| 猫咪WWW免费人成人入口| 中文字幕无码不卡一区二区三区| 蜜臀AV性久久久久蜜臀AⅤ| 77777_亚洲午夜久久多人| 欧美熟VIDEOS肥婆| 波多野结衣AV一区二区三区中文| 人妻丰满AV无码中文字幕| 超碰97人人做人人爱可以下载| 日本熟妇人妻XXXXX-欢迎您| 大地韩国日本HD免费完整| 欧美又大粗又爽又黄大片视频| BT天堂新版中文在线地址| 日本大一大二大三在一起读吗| 重囗味sm在线观看无码| 女性高爱潮免费有声视频网站 | 人妻少妇精品视中文字幕国语| 成人免费一区二区三区视频| 色久综合网精品一区二区| 国产成人综合色视频精品| 亚洲AV成人片无码色欲AV自慰 | 中文乱码精品一区二区三区人妻| 欧美狂野乱码一二三四区| 成人精品一卡2卡3卡4卡新区乱| 四川骚妇无套内射舔了更爽| 国产人成亚洲综合无码AⅤ蜜桃| 亚洲国产激情一区二区三区| 伦人伦XXXX国语对白| はるとゆき温泉旅馆攻略| 特级毛片A级毛片免费观看网站 | 亚洲国产精品久久久久爰| 麻豆精品传媒一二三区| ぱらだいす天堂中文WWW最新版| 熟女乱色一区二区三区| 狠狠色噜噜狠狠狠7777米奇| 泳池里强摁做开腿呻吟| 强开小婷嫩苞又嫩又紧视频| 国产成人无码AV一区二区在线观| 亚洲AⅤ成人精品无码| 久久亚洲中文字幕精品一区| 啊灬啊灬啊灬快灬高潮了| 无码人妻av免费一区二区三区| 精品人妻少妇一区二区| 99国产精品久久久久久久成人热| 日韩无人区码卡二卡3卡一| 黑人大荫蒂老太大| 最新国产精品拍自在线观看| 少妇无码太爽了不卡视频在线看 | 国产国语对白又大又粗又爽| 亚洲色精品三区二区一区| 欧美肥妇多毛BBW| 国产精品一线二线三线有什么区别| 亚洲精品沙发午睡系列| 欧美激情一区二区三区成人| 国产成人AV免费观看| 亚洲欧美性爱视频在线| 亲子伦AV一区的三区| 国产亚洲精品精品精品| 97久久精品午夜一区二区| 我把护士日出水了视频| 久久亚洲春色中文字幕久久久| 成人国产亚洲精品A区| 亚洲精品无码成人| 人善之交Z0OZO0D0G人善| 激情内射人妻1区2区3区| ワンピースのエロ官网| 亚洲AV无码一级毛片少妇| 青青草国产成人99久久| 狠狠躁天天躁日日躁欧美|