laravel-admin 与 vue 结合使用实例代码详解


Posted in Javascript onJune 04, 2019

由于 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="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 的内容无法全部渲染到前端,导致页面出错。

总结

以上所述是小编给大家介绍的laravel-admin 与 vue 结合使用实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript移除数组元素减少长度的方法
Sep 05 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
Bootstrap框架实现广告轮播效果
Nov 28 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 Javascript
解决layui 三级联动下拉框更新时回显的问题
Sep 03 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 Javascript
如何使用原生Js实现随机点名详解
Jan 06 Javascript
Vue如何实现变量表达式选择器
Feb 18 Vue.js
用webpack4开发小程序的实现方法
Jun 04 #Javascript
JS实现的对象去重功能示例
Jun 04 #Javascript
JS数组中对象去重操作示例
Jun 04 #Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 #jQuery
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
Jun 04 #Javascript
ES6中字符串的使用方法扩展
Jun 04 #Javascript
详解vue-cli3多页应用改造
Jun 04 #Javascript
You might like
一个多文件上传的例子(原创)
2006/10/09 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Python构建网页爬虫原理分析
2017/12/19 Python
python构建深度神经网络(续)
2018/03/10 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
基于树莓派的语音对话机器人
2019/06/17 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
python+tkinter实现学生管理系统
2019/08/20 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
linux下进程间通信的方式
2014/12/23 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
2015选调生工作总结
2015/07/24 职场文书