03.vue组件

一、组件

  • 组件 (Component) 是 Vue.js 最强大的功能之一
  • 组件可以扩展 HTML 元素,封装可重用的代码

03.vue组件_第1张图片

二、 组件注册

2.1 全局注册

  • Vue.component(组件名称, { data: 组件数据, template: 组件模板内容 })
  • 全局组件注册后,任何vue实例都可以用
组件基础用法

<组件名称>

2.2 组件注意事项

  • 组件参数的data值必须是函数,同时这个函数要求返回一个对象
  • 组件模板必须是单个根元素
  • 组件模板的内容可以是模板字符串(用反引号包含起来)
  

2.3 命名方式

  • 短横线方式(推荐)
    Vue.component('my-component', { /* ... */ })
  • 驼峰方式
    Vue.component('MyComponent, { /* ... */ })
    注意:驼峰方式命名的组件 一般情况都是可接受的,比如在字符串模版中使用。但直接在 DOM 中使用时只有 是有效的。

2.4 局部注册

  • 只能在当前注册它的vue实例中使用
  

三、Vue 调试工具

链接:https://pan.baidu.com/s/139hspAnspD7bJbo81xigmg 密码:1hsv

四、 Vue组件之间传值(数据交互)

4.1 父组件向子组件传值

  1. 子组件内部通过props属性接收传递过来的值
Vue.component(‘menu-item', {
    props: ['title'],
    template: '
{{ title }}
' })
  1. 父组件通过属性将值传递给子组件
可以传递静态数据
 
也可以动态绑定

  1. 在props中定义要接收的属性名时使用驼峰形式,在DOM中直接引入组件时需要使用短横线的形式,字符串形式的模板中则没有这个限制
Vue.component('third-com', {
    // 在 JavaScript 中是驼峰式的
    props: ['testTitle'],
    template: '
{{ testTitle }}' }) Vue.component('menu-item', { // 在 JavaScript 中是驼峰式的 props: ['menuTitle'], template: '
{{ menuTitle }}
' //字符串模版内驼峰式使用属性没有影响 })
  1. 传值类型
    如果子组件需要得到原始类型,比如数字型、布尔型,在父组件中推荐使用:属性=属性值的形式进行绑定,否则都会传递字符串类型。
    
{{pmsg}}
Vue.component('menu-item', { props: ['pstr', 'pnum', 'pboo', 'parr', 'pobj'], template: `
{{pstr}}
{{12 + pnum}}
{{typeof pboo}}
  • {{item}}
{{pobj.name}} {{pobj.age}}
` }); var vm = new Vue({ el: '#app', data: { pmsg: '父组件中内容', pstr: 'hello', parr: ['apple', 'orange', 'banana'], pobj: { name: 'lisi', age: 12 } } });

实例

  
{{pmsg}}

4.2 子组件向父组件传值

  1. 子组件通过自定义事件向父组件传递信息,用$emit()触发事件
  2. 父组件用v-on监听子组件的事件
    直接写事件处理逻辑时使用数据

    绑定函数时使用

 
{{pmsg}}

4.3 兄弟之间的传递

兄弟之间传递数据需要借助于事件中心,通过事件中心传递数据

  1. 提供事件中心
    var eventHub = new Vue()
  2. 接收数据方,通过mounted(){} 钩子中设置监听(注册)事件
    eventHub.$on('方法名', 数据形参)
  3. 传递数据方触发事件
    eventHub.$emit(‘方法名', 传递的数据)
  4. 销毁事件,通过eventhub.$off()销毁之后,无法进行传递数据
    eventHub.$off('方法名')
 
父组件

五、 组件插槽

指父组件向子组件传递模版内容,子组件预留的位置(template中的slot)就叫插槽。而传递给slot的内容就是组件标签之间的内容。
组件的最大特性就是复用性,而用好插槽能大大提高组件的可复用能力

5.1 匿名插槽

  
有bug发生 有一个警告

5.2 具名插槽

  • 具有名字的插槽
  • 使用 中的 "name" 属性绑定元素
  

标题信息

主要内容1

主要内容2

底部信息信息

主要内容1

主要内容2

5.3 作用域插槽

  • 父组件可以对子组件内容加工处理
  • 既可以复用子组件的slot,又可以使slot内容不一致
  

六、 基于组件的购物车案例

6.1. 实现组件化布局

  • 把静态页面转换成组件化模式
  • 把组件渲染到页面上
 

6.2、实现 标题和结算功能组件

  • 标题组件实现动态渲染

    • 从父组件把标题数据传递过来 即 父向子组件传值
    • 把传递过来的数据渲染到页面上
  • 结算功能组件

    • 从父组件把商品列表list 数据传递过来 即 父向子组件传值
    • 把传递过来的数据计算最终价格渲染到页面上
 

6.3. 实现列表组件删除功能

  • 从父组件把商品列表list 数据传递过来 即 父向子组件传值
  • 把传递过来的数据渲染到页面上
  • 点击删除按钮的时候删除对应的数据

    • 给按钮添加点击事件把需要删除的id传递过来

      • 子组件中不推荐操作父组件的数据有可能多个子组件使用父组件的数据 我们需要把数据传递给父组件让父组件操作数据
      • 父组件删除对应的数据
 

6.4. 实现组件更新数据功能 (上)

  • 将输入框中的默认数据动态渲染出来
  • 输入框失去焦点的时候 更改商品的数量
  • 子组件中不推荐操作数据 把这些数据传递给父组件 让父组件处理这些数据
  • 父组件中接收子组件传递过来的数据并处理
 

6.5. 实现组件更新数据功能 (下)

  • 子组件通过一个标识符来标记对用的用户点击 + - 或者输入框输入的内容
  • 父组件拿到标识符更新对应的组件



  
  Document
  


  

你可能感兴趣的:(vue.js)