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 相关文章推荐
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
js实现将选中值累加到文本框的方法
Aug 12 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
Angular实现搜索框及价格上下限功能
Jan 19 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 jQuery
vue+elementui实现点击table中的单元格触发事件--弹框
Jul 18 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设计模式 Facade(外观模式)
2011/06/26 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
python删除过期文件的方法
2015/05/29 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
详解python中的hashlib模块的使用
2019/04/22 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
python如何更新包
2020/06/11 Python
python开发入门——列表生成式
2020/09/03 Python
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
公务员职务工作的自我评价
2013/11/01 职场文书
CNC数控操作工岗位职责
2013/11/19 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
Redis数据结构之链表与字典的使用
2021/05/11 Redis
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python