laravel-admin 與 vue 結(jié)合使用實例代碼詳解
由于 Laravel-admin 采用的是 pjax 的方式刷新頁面,意味著很多頁面刷新的操作,并不是刷新整個 document,而是從服務(wù)器拿到部分 document,再通過類似 $(“#pjax-container”).html(newPart) 的方式更新的。
這就造成一個問題,每次 pjax 刷新,都會破壞 vue 的 dom 映射。
所以理論上有2種方法解決:
重新綁定一下 vue 的映射關(guān)系
在某些頁面禁止 pjax
1 太難搞,而且沒啥資料,放棄。2 的話比較可行。
部分禁止 pjax
打開 public/vendor/laravel-admin/laravel-admin/laravel-admin.js
添加代碼:
// 不使用 pjax 刷新的頁面
$(document).on('pjax:beforeReplace', function (e, options) {
// console.log(arguments)
var freshPaths = [
/\/admin.*\/products/,
]
for (let path of freshPaths) {
if (path.test) {
if (path.test(e.state.url)) {
location.reload()
return false
}
}
else if (options.url.search(path) !== -1) {
location.reload()
return false
}
}
})
使用自定義 view
很多時候我們并不需要大動干戈地建立一個全部的 view,只需要在內(nèi)置 view 中稍作修改。
這時候,我們需要先自定義一個 Content 類:
use Encore\Admin\Layout\Content;
class MyContent extends Content {
public function render() {
$items = [
'header' => $this->header,
'description' => $this->description,
'breadcrumb' => $this->breadcrumb,
'content' => $this->build(),
];
return view('admin.content', $items)->render();
}
}
然后引用它:
public function index(MyContent $content) {
return $content
->header('product')
->description($this->brand)
->body($this->grid());
}
這樣一來,每次進入到 index 頁面,都會渲染 admin.content 這個 view 。
view 的內(nèi)容直接 copy 自 vendor/encore/laravel-admin/resources/views/content.blade.php
在 view 里插入 vue 組件
添加2部分代碼即可。
第一部分是初始化 vue app:
<script data-exec-on-popstate>
// boot up the demo
$(function () {
// vapp
window.vapp = new Vue({
el: '#app',
data () {
return {
status: {
showGalleryEditor: false,
},
store: {
images: [],
el: '',
},
}
},
components: {},
methods: {
startGalleryEditing (event) {
this.status.showGalleryEditor = true
this.store.pk = $(event.target).parent().find('ul').data('pk')
this.store.images = $(event.target).parent().find('img').toArray().map((e) => e.getAttribute('src'))
window.p = $(event.target).parent().find('ul')
},
},
})
})
</script>
第2部分是插入組件:
<gallery-editor :status="status" :images="store.images" :pk="store.pk"> </gallery-editor>
vue 組件單獨一個 js 文件
位置如下:
public/vendor/components/gallery-editor.js
定義如下:
Vue.component('gallery-editor', {
props: {
status: {
showGalleryEditor: false,
},
images: [],
pk: 0,
moveTo: [],
},
data () {
return {}
},
watch: {
images (newVal, oldVal) {
this.moveTo = []
for (let src of newVal) {
this.moveTo.push({
src: src,
productId: this.pk,
deleted: 0,
})
}
},
},
methods: {
close () {
this.status.showGalleryEditor = false
},
save () {
let args = {_token: LA.token}
args.id = this.pk
args.images = []
args.move_to = []
// console.log(JSON.stringify(this.moveTo))
for (let imgObj of this.moveTo) {
if (imgObj.deleted) {
continue
}
if (imgObj.productId === this.pk) {
args.images.push(imgObj.src)
} else {
args.move_to.push({src: imgObj.src, product_id: imgObj.productId})
}
}
// console.log(JSON.stringify(args))
$.post('/admin/products/move-images', args).done(() => {
toastr.success('success')
this.status.showGalleryEditor = false
}).fail((response) => {
toastr.error(response.responseText)
})
},
},
template: `
<div class="modal" tabindex="-1" role="dialog" :class="{show: status.showGalleryEditor, fade: !status.showGalleryEditor}">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close" @click="close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Editing images</h4>
</div>
<div class="modal-body">
<ul style="list-style-type: none;">
<li v-for="(imageObj, key) in moveTo" :key="key" style="margin-bottom: 8px">
<img :src="imageObj.src" alt="" style="width:40px;height:40px">
<label>Move to product: <input type="text" v-model="imageObj.productId"></label>
<label>Delete:<input type="checkbox" v-model="imageObj.deleted"></label>
</li>
</ul>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal" @click="close">Close</button>
<button type="button" class="btn btn-primary" @click="save">Save changes</button>
</div>
</div>
</div>
</div>`,
})
這是一個彈出式編輯框,具體作用就不解釋了,只是個示例。
然后還需要在 Admin/bootstrap.php 中引用這個 js 文件:
Admin::js('/vendor/components/gallery-editor.js');為什么不把組件代碼直接寫進 view 中呢?
因為 pjax 的后端邏輯似乎有 bug,template 的內(nèi)容無法全部渲染到前端,導(dǎo)致頁面出錯。
總結(jié)
以上所述是小編給大家介紹的laravel-admin 與 vue 結(jié)合使用實例代碼詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
vue父組件數(shù)據(jù)更新子組件相關(guān)內(nèi)容未改變問題(用watch解決)
這篇文章主要介紹了vue父組件數(shù)據(jù)更新子組件相關(guān)內(nèi)容未改變問題(用watch解決),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
vue3不能使用history.pushState修改url參數(shù)踩坑
這篇文章主要為大家介紹了vue3不能使用history.pushState修改url參數(shù)踩坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Vue實戰(zhàn)之vue登錄驗證的實現(xiàn)代碼
本篇文章主要介紹了Vue實戰(zhàn)之vue登錄的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
vue 數(shù)據(jù)(data)賦值問題的解決方案
這篇文章主要介紹了vue 數(shù)據(jù)(data)賦值問題的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

