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 相关文章推荐
JS判断、校验MAC地址的2个实例
May 05 Javascript
Javascript MVC框架Backbone.js详解
Sep 18 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
使用angular写一个hello world
Jan 23 Javascript
jQuery深拷贝Json对象简单示例
Jul 06 Javascript
jQuery动态生成Bootstrap表格
Nov 01 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
Angularjs的Controller间通信机制实例分析
Nov 07 Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 Javascript
javascript实现蒙版与禁止页面滚动
Jan 11 Javascript
用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
php 设计模式之 单例模式
2008/12/19 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
深入了解js原型模式
2019/05/30 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
工业设计专业推荐信
2013/10/29 职场文书
学校采购员岗位职责
2014/01/02 职场文书
高中军训感言400字
2014/02/24 职场文书
2014年三万活动总结
2014/04/26 职场文书
触电现场处置方案
2014/05/14 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
工作失职检讨书范文
2015/05/05 职场文书
计算机教师工作总结
2015/08/13 职场文书
一行Python命令实现批量加水印
2022/04/07 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS