Vue 2.x 实战之后台管理系统开发(二)

1. 导语

承接上文:Vue 2.x 实战之后台管理系统开发(一)

在上一篇文章中,我详细叙述了如何创建项目框架和引入各种后台常用插件,做好这些准备工作后,我们就可以着手进行页面的开发了。在开发过程中,会遇到一些常见的需求和问题,我整理了一下,有以下几点。

2. 常见需求

01. 父子组件通信

a. 父 -> 子(父组件传递数据给子组件)

使用 props,具体查看文档 - 使用 Prop 传递数据(cn.vuejs.org/v2/guide/co…

b. 父 -> 子(在父组件上调用子组件内的方法)

使用 ref,具体查看文档 - 子组件索引(cn.vuejs.org/v2/guide/co…


<div id="parent">
  
  <user-profile ref="profile">user-profile>
div>复制代码
// 父组件 script
this.$refs.profile.someMethod();复制代码

注意:如果在子组件上设置 ref 属性,则可以通过 this.$refs 获取到该子组件对象,如果在普通的 html 标签上设置 ref 属性,则获取到的是 Dom 节点。

c. 子 -> 父(在父组件上获取子组件内的数据)

同上,也是利用 ref

// 父组件 script
let childData = this.$refs.profile.someData;复制代码

d. 子 -> 父(子组件内触发事件,父组件监听事件)

父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件,具体查看文档 - 使用 v-on 绑定自定义事件(cn.vuejs.org/v2/guide/co…


<div id="parent">
  
  <user-profile @childTrigger="parentHandle">user-profile>
div>复制代码
// 父组件 script
methods: {
    parentHandle(params){
        // 这个方法在子组件 emit childTrigger 事件后会执行
        // params 为子组件里触发事件时传的参数
    }
}复制代码
// 子组件 user-profile script
this.$emit('childTrigger', params);复制代码

e. 子 -> 父(子组件传值,父组件里使用,具体实现见 03

01总结:
应用场景示例:在父组件上打开侧边栏子组件,可以传 prop visible(true)来控制侧边栏打开;侧边栏内部有关闭按钮,就在点击关闭按钮后触发一个事件,父组件监听事件执行方法将 data visible 改为 false
PS:父组件传值到子组件,传的值是 Object 类型,子组件使用 v-model 可以修改该值(将某个表单元素的 v-model 设为该值),父组件可直接获取到改变后的值。

02. 全局函数

有时候会用到一些工具类函数,希望可以全局调用,而不是局限于某个组件中。

Step 1:
项目根目录/static/js/ 目录下新建一个 util.js 文件,将常用的工具函数写在这里面。

Step 2:
index.html 里面引入 util.js,就可以在 .vue 文件里使用那些方法了,如下:


  <div id="app">div>
  
  <script type="text/javascript" src="/static/js/util.js">script>
   
body>复制代码

02总结:
使用这个方法可以使得一些使用频率高的函数可以在所有 .vue 文件中被调用,笨拙而又简单。

03. slot

以前看文档时一直不理解如何使用 slot,现在用多了 elementui 的组件之后,就渐渐发现了它的实用性。
简单来说,使用 slot 可以使我们做到:在父组件里使用子组件时,在子组件里插入一些自定义的内容(html 代码啥的),具体查看文档:cn.vuejs.org/v2/guide/co…
更神奇的功能是 作用域插槽,可以让我们在父组件里使用子组件时,获取子组件传来的数据,具体查看文档:cn.vuejs.org/v2/guide/co…

简单应用示例


<button type="button" class="a-button" @click="$emit('btn-click')"><slot>slot>button>
复制代码

<a-button @btn-click="handleClick">这里写的东西会覆盖子组件里的 slot 标签所在的位置a-button>
复制代码

渲染结果:

<button type="button" class="a-button">这里写的东西会覆盖子组件里的 slot 标签所在的位置button>复制代码

可以应用简单的 slot 来达到为不同的按钮填充文字的目的:

<a-button @click="handleClick">详情a-button>
<a-button @click="handleClick">搜索a-button>


<button type="button" class="a-button">详情button>
<button type="button" class="a-button">搜索button>复制代码

作用域插槽示例


<div class="child">
  
  
  <slot text="hello from child" :child="name">slot>
div>复制代码

在父级中,具有特殊属性 scope