• vue组件


    vue组件

    • 组件是自定义的HTML元素
    • 组件扩展了HTML元素,封装了可重用的HTML代码
    组件的使用
    • 创建组件构造器
      • Vue.extend(config:object)
      • config参数 template:"<div>组件模板</div>"
      • 创建组件构造器,而不上一个具体的组件实例,template表示要渲染成的结构
    • 注册组件
      • Vue.component()
      • Vue.component("my-component",组件构造器)
      • 这里才是创建一个组件的实例
      • 组件的注册是全局的
      • 局部注册用选项对象的components属性
      • vue提供了语法糖,可以直接创建和注册Vue组件---Vue.component('my-component',{template:"<div>渲染后的html结构</div>"})
      • 当然使用局部注册方法同样可以 components:{'my-component':{template:"<div>...</div>"}}
    • 使用组件
      • <my-component></my-component>
      • 在html中要求标签正确的闭合,在.vue中可以单标签
    • 组件就是对自定义的标签,先创建组件构造器,也是对Vue对象的扩展,构造器参数中的template就是组件渲染后的html结构,利用Vue.components进行注册,注册后才可以使用,然后new Vue(...)创建Vue实例,在Vue实例下可以使用注册的组件
      • 父子组件
        • 一个组件也就是一个Vue实例,多数Vue选项都可以在Vue.extend()中使用
        • 子组件注册在父组件中,子组件在父组件的template中使用
    • 分离template选项,不再把字符串写在js代码中
      • 方法 1 使用script标签,修改type属性为"text/x-template",添加id,使用时template:"#模板id"
      • 方法 2 使用<template id="tpl">组件
    • 父组件向子组件传值 使用props选项 这里是在子组件中使用props
    components:{
      "my-component":{
        template:"<div>{{myname}}</div>",
        //在这里使用props选项可以把父组件的值传递到子组件中,
        //当然模板中也可以是data中的值,但data中的不能和父组件通信
        props:['myname']
      }
    }
    
    • 组件作用域
      • template属性使用<template></template>标签,h5的新标签,IE不支持
      • 组件是有作用域的,组件的模板也是在作用域中编译的,这个作用域就是tempalte标签内的区域
      • 父组件的数据只能在父组件的模板(作用域)内使用,子组件的数据只能在子组件的模板(作用域)内使用,如果父组件的数据要在子组件中使用,应该用props传递数据
    • slot
    • 自定义事件系统
      • 独立于原生的dom事件
      • 分为
        • $on()监听事件
        • $emit()触发事件
        • $dispatch()派发事件,向上冒泡
        • $broadcast向下广播事件
      • 2.x取消了events选项,需要我们在created钩子中使用$on()来监听事件。

    问题

    • 在vue2.4中props的数据流是单项的,也就是说当父组件的属性发生变化时,将传到给子组件,反过来则不会,当你在子组件中操作props中的值时,vue会给予警告。但遇到的问题是,在子组件中操作props传过来的一个数组,不给警告,且操作成功。子组件修改了父组件的数据。
      • 在官方文档中有说明,js中的数组和对象是引用类型的,指向是同一个内存空间的,当你修改子组件会影响父组件。
  • 相关阅读:
    Git
    vue
    vue
    echarts,dojo和兼容问题
    js数组对象以某一对象排序
    滚动条与图片移动
    vue
    vue
    vue页面组件化-父子组件传值
    phpquery笔记
  • 原文地址:https://www.cnblogs.com/navysea/p/7443254.html
Copyright © 2020-2023  润新知