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去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
如何判断元素是否为HTMLElement元素
Dec 06 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
node.js中module模块的功能理解与用法实例分析
Feb 14 Javascript
jquery实现有过渡效果的tab切换
Jul 17 jQuery
用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维护文件系统
2006/10/09 PHP
php curl常用的5个经典例子
2017/01/20 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
JSONP跨域请求
2017/03/02 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
TensorFlow如何实现反向传播
2018/02/06 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
详解Python用户登录接口的方法
2019/04/17 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
商场活动策划方案
2014/01/24 职场文书
服务承诺书范文
2014/05/19 职场文书
财务会计实训报告
2014/11/05 职场文书
2015政治思想表现评语
2015/03/25 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js