由于 Laravel-admin 采用的是 pjax 的方式刷新页面,意味着很多页面刷新的操作,并不是刷新整个 document,而是从服务器拿到部分 document,再通过类似 $(“#pjax-container”).html(newPart) 的方式更新的。
这就造成一个问题,每次 pjax 刷新,都会破坏 vue 的 dom 映射。
所以理论上有2种方法解决:
重新绑定一下 vue 的映射关系
在某些页面禁止 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,只需要在内置 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 的内容直接 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="/UploadFiles/2021-04-02/imageObj.src">
这是一个弹出式编辑框,具体作用就不解释了,只是个示例。
然后还需要在 Admin/bootstrap.php 中引用这个 js 文件:
Admin::js('/vendor/components/gallery-editor.js');为什么不把组件代码直接写进 view 中呢?
因为 pjax 的后端逻辑似乎有 bug,template 的内容无法全部渲染到前端,导致页面出错。
总结
以上所述是小编给大家介绍的laravel-admin 与 vue 结合使用实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]