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实现继承机制之原型链(prototype chaining)的详解
May 07 Javascript
JS实现切换标签页效果实例代码
Nov 01 Javascript
js中创建对象的几种方式示例介绍
Jan 26 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
Dec 07 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
JS中Promise函数then的奥秘探究
Jul 30 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
VUE解决跨域问题Access to XMLHttpRequest at
May 06 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
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php发送与接收流文件的方法
2015/02/11 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
使用JavaScript switch case 另类写法
2010/03/14 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
Python3基础之条件与循环控制实例解析
2014/08/13 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python虚拟环境项目实例
2017/11/20 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python列表list排列组合操作示例
2018/12/18 Python
python with语句的原理与用法详解
2020/03/30 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
好的自荐信的要求
2013/10/30 职场文书
导游的职业规划书范文
2013/12/27 职场文书
考试没考好检讨书
2014/01/31 职场文书
求职意向书
2014/04/01 职场文书
小班上学期个人总结
2015/02/12 职场文书
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python