vue组件

1. 组件化开发

根据封装的思想,把页面上可复用的UI结构封装为组件,从而方便开发和维护。

2. Vue中的组件化开发

Vue.js是一个支持组件化开发的前端框架,规定组件的后缀名为.vue

3. Vue组件的组成部分

注意:按下面的顺序!!!

  • template:组件的模板结构(UI结构)

    vue2.x中template节点内的DOM结构仅支持单个根节点

    vue3.x中支持多个根节点,就可以省略包裹性质的最外层的div了

  • script:组建的js行为(js)

    注意默认的写法,一打script就会默认出来

    注意data,要用函数的形式,定义在return对象里!!

  • style:组件的样式(css)

    默认是css语法,若想启用less等,则需要在style中添加lang属性,e.g. style lang=”less”

组件的组成

4. 组件间的关系

组件在封装好后,彼此之间是相互独立的,只是在使用组件的时候,根据彼此的嵌套关系,形成父子关系、兄弟关系。

5. 使用组件

  • import导入组件
  • 使用components节点注册组件
  • 以标签形式使用注册好的组件

6.私有组件 v.s. 全局组件

  • 通过components注册的是私有子组件

    私有:若在组件A的components下注册了组件F,则组件F只能在组件A中使用,若组件C也想使用还需要上述三步骤

  • main.js中通过Vue.component(标签名,注册的组件名)注册全局组件

    全局:在main.js中注册后可以直接在组件中用标签名进行使用

但是如果使用组件的不同父组件想要传递的初始值不同,怎么办?

7.组件的props

props是组件的自定义属性,在封装通用组件的时候,合理使用props可以提高复用性,props允许使用者通过自定义属性为组件指定初始值。

7.1 语法

export default {

props: [’自定义属性1‘,’自定义属性2‘,’自定义属性3‘…],

​ data() {

​ return {}

​ },

​ …

}

7.2 props v.s. data

首先,这两种都是vue中提供的存储变量的不同方法,那么区别是什么?

  • data是每个组件内部的私有数据,只能在改组件内部使用
  • props是从父组件传递给子组件的数据,可以进行读取,但不能修改

7.3 props的只读性

vue中规定组件封装的自定义属性是只读的不能直接修改props的值

如果想要修改props的值,将props的值转存到data中,因为data中的数据就是可读写的了~

props

但是注意在父组件传参的时候!!!!!

不适用v-bind就会传入的是字符串!!!!

v-bind:init = 1

注意:只有当字符串传递的时候才不用v-bind!!


reference:https://blog.csdn.net/it1993/article/details/104468677

7.4 props的default默认值

在声明自定义属性时,可以通过default来定义属性的默认值

在7.3中,props在定义时以数组的形式,但是如果还想再额外的定义默认值,需要改造成对象的形式。

props: {

​ init: {

​ default: 0

}}

7.5 props的type值类型

type可以在封装组件时对外界传递进来的props数据进行合法性的校验

type对props传进来的值进行校验

7.6 props的required必填项

注意: required和默认值default无关,哪怕设置了default,只要使用者没有传参就报错。

8.组件间的样式冲突问题

默认情况下:写在.vue中的样式会全局生效,很容易造成多组件间样式冲突问题。

8.1 造成样式冲突的根本原因

  • 单页面应用程序中,所有组件的DOM结构都是基于唯一的html页面进行呈现的
  • 每个组件中的样式,都会影响整个index.html中的DOM元素

8.2 如何解决?

  • 办法一:给每个组件分配唯一的自定义属性,e.g. data-v-001,然后通过属性选择器来控制样式的作用域

    【缺点:所有的UI结构都需要编码并添加自定义属性,开发效率地下】

  • 办法二: 给style节点添加scoped属性

    底层逻辑就是自动添加唯一的自定义属性

    style scoped

    那么给当前组件添加scoped属性,但对其子组件不生效怎么办?

  • 办法三:样式穿透 /deep/

    /deep/ .title {xxx}


vue组件
http://example.com/2023/07/10/vue组件/
Author
John Doe
Posted on
July 10, 2023
Licensed under