day3 vue2 学习笔记 vue组件

 系列文章目录

day1学习vue2笔记 vue指令

day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios

day3 vue2 学习笔记 vue组件

day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

day5 vue 笔记 axios 动态组件 插槽 自定义指令 ESLints

day6 vue 学习笔记 vue-router路由

文章目录

前言

一、vue 组件

1、什么是组件化开发

2、  vue  中的组件开发

3、vue  组件的三个组成部分

4、组件之间的父子关系

4.1使用组件的三个步骤

4.2 通过  component  注册的是私有子组件

4.3 注册全局组件

 5、组件的 props

5.1  props  是只读的

 5.2  props  的  default  默认值

5.3  props 的 type 值类型

 5.4  props   的 required  必填项

6、组件之间的样式冲突

6.1 解决样式冲突问题:

6.2  /deep/ 样式穿透

总结

vue 组件


前言

vue2 学习笔记


一、vue 组件

1、什么是组件化开发

组件化开发指的是:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发和维护

2、  vue  中的组件开发

vue  是一个支持组件化开发的前端框架。

vue  中规定:组件的后缀名  是 .vue。之前接触到的App.vue 文件本质上就是一个  vue  组件。

3、vue  组件的三个组成部分

每一个  .vue 组件都由3部分构成,分别是:

  • template  --> 组件的  模板结构
  • script  --> 组件的   JavaScript 行为
  • style    --> 组件的  样式
<template>
  <div  class="test_box">
    <span>{{user_name}}</span>
    <button @click="changeName">确定</button>
 
  </div>
</template>
 
<script>
  //<!--   默认导出,这是固定写法-->
  export default {
    name: "demo_test",
    // data 数据源
    // 注意 vue 组件中的  data 不能像之前一样,不能指向对象。
    // 注意: 组件中的 data 必须是一个函数
    data(){
      //这个return 出去的 {} 中,可以定义数据
      return {
        user_name:'张三',
      }
    },
  //方法函数区
    methods:{
      changeName(){
        /**
         * 在组件中  this 就表示当前实例的对象
         */
        console.log(this)
        this.user_name='李四'
      }
    },
  //  当前组件中的侦听器
    watch:{},
  // 当前组件中的计算属性
    computed:{},
  // 当前组件中在过滤器
    filters:{},
  }
</script>
 
<style scoped lang="less">
  .test_box{
    background-color: coral;
  }
 
</style>
 
 
 

4、组件之间的父子关系

组件在封装好之后,彼此之间是相互独立的,不存在父子关系;

 在使用组件的时候,根据彼此的嵌套关系,形成了父子关系兄弟关系

4.1使用组件的三个步骤

@指向配置  :在vue 中vue-cli 已经配置了

# webpack.config.js


module.exports = {
    resolve:{
        alias:{
            @:path.join(_dimame,'./src')
        }
    }

}

步骤1:使用  import 语法导入需要的组件;

步骤2: 使用  components  节点注册组件;

步骤3: 以标签的形式使用刚才注册的组件

<template>
  <div class="app-container">
    <h1>App 根组件</h1>
    <hr />
    <div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <!-- 3、以标签的形式使用刚才注册的组件-->
      <Left></Left>
    </div>
  </div>
</template>
<script>
  //1、导入  left 组件
  import Left from "@/components/Left";
  export default {
    /**
     * 2、components:注册组件
     */
    components:{
      Left
    },
    data(){
      return{
      }
    },
  }
</script>

<style lang="less">
  .app-container {
    padding: 1px 20px 20px;
    background-color: #efefef;
  }
  .box {
    display: flex;
  }
</style>

websorm 插件名称为  File  Path  Autocomplete

4.2 通过  component  注册的是私有子组件

例如:

在组件A 的components  节点下,注册了组件F

则在组件 F 只能在组件A 中;不能被 其他组件使用。

4.3 注册全局组件

在 vue 项目的  main.js  入口文件中,通过  Vue.commponent()  方法,可以注册全局组件。

 

 

 在注册的组件中使用自己的组件会报错(循环嵌套组件 ),并且无意义。

当只有一行代码是  click 事件可以简写为 

 5、组件的 props

props  是组件的自定义属性,在封装通用组件的时候,合理的使用  props  可以极大的提高组件的复用性.

定义完成使用

  • props  是自定义的属性,允许使用这通过自定义属性,当前组件指定初始值
  • 自定义属性的名字是封装者自定义的(只要名称合法即可)
  • 通过该属性穿过来的值可以通过    :   /   v-bind  进行属性绑定
  • props  是只读的,不要直接修改  props  的值,否则会报错
  • 要修改 props 的值,可以吧  props 的值转存到 data中,因为data 中的数据是可读可写的
  • 在声明自定义属性时,可以通过  default  来定义属性的默认值
  • 在声明自定义属性时,可以通过  type  来定义属性的值类型

5.1  props  是只读的

vue 规定:组件中封装的自定义属性是只读的,程序员 不能直接修改  props 的值,否则会直接报错

 要修改  props  的值,可以把  props  的值转存到  data 中,因为  data 中的数据是可读可写的

<template>
    <div>
        <h5>Count组件</h5>
        <span>count 值是 {{count}}</span>
        <br>
        <button @click="add1">+1</button>
        <button @click="count -= 1">-1</button>
    </div>
</template>
<script>
    export default {
        name: "Count",
        // props  是自定义属性,允许使用这通过自定义属性,当前组件指定初始值
        // 自定义属性的名字是封装者自定义的(只要名称合法即可)
        // props 中的数据,可以直接在模板结构中使用
        // props 是只读的,不可用直接修改,修改了会报错
        //
        // props:['init_count'],
        props:{
            //    在其中定义自定义属性
            init_count:{
                //如果外键使用  init_count 组件的时候,没有传递  init_count 属性,则默认值生效
                default:0,
                // init_count 的值类型  Number 数字
                type:Number,
                // 必填项校验,默认为 false
                required: true,
            }
        },
        data(){
            return{
                //this.init_count  通过this 获取组件属性的值
                count:this.init_count,
            }
        },
        methods:{
            add1(){
                this.count +=1;
            },
        }
    }
</script>
<style scoped>
</style>
<!--使用到  Count 组件  通过 props 传自定义值-->
<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <Count :init_count="9"></Count>
  </div>
</template>
<script>
export default {}
</script>
<style lang="less">
.left-container {
  padding: 0 20px 20px;
  background-color: orange;
  min-height: 250px;
  flex: 1;
}
</style>
<template>
  <div class="right-container">
    <h3>Right 组件</h3>
    <Count></Count>
  </div>
</template>
<script>
export default {}
</script>
<style lang="less">
.right-container {
  padding: 0 20px 20px;
  background-color: lightskyblue;
  min-height: 250px;
  flex: 1;
}
</style>

 5.2  props  的  default  默认值

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

5.3  props 的 type 值类型

在声明自定义属性时,可以通过 type 来定义属性的值类型。

 5.4  props   的 required  必填项

6、组件之间的样式冲突

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

导致组件之间的样式冲突的根本原因是:

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

6.1 解决样式冲突问题:

原理:给需要用到的 标签中增加一个自定义属性,在 style 中也增加一个这样的属性即可;

例如:

<template>
  <div class="left-container">
    <h3  data-v-001>Left 组件</h3>
    <Count :init_count="9"></Count>
  </div>
</template>
<script>
  export default {}
</script>
<style lang="less" >
  .left-container {
    padding: 0 20px 20px;
    background-color: orange;
    min-height: 250px;
    flex: 1;
  }
  h3[data-v-001] {
    color: red;
  }
</style>

实际运用写法:

style 中增加一个 scoped  属性即可;

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <Count :init_count="9"></Count>
  </div>
</template>
<script>
  export default {}
</script>
<style lang="less" scoped>
  .left-container {
    padding: 0 20px 20px;
    background-color: orange;
    min-height: 250px;
    flex: 1;
  }
  h3{
    color: red;
  }
</style>

在创建 vue 时尽量的增加  scoped 属性,以防样式冲突

6.2  /deep/ 样式穿透

当使用第三方库的时候,如果需要修改第三方默认样式的需求,就需要用到  /deep/  ;

当只用到  scoped 时就会在当前的  vue 组件中的样式,那么当前样式就只会在当前组件中使用,如果有嵌套的组件,那么需要修改 子组件中的样式,那么就可以通过   /deep/ 来实现修改。

应用场景:当使用到第三方组件库时,如果需要更改其背景颜色,那么就可以使用  /deep/ 来找到该元素进行更改。

演示:更改  组件  count  中的  h5 标签的字体颜色

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
<!--    在使用组件的时候,如果某个属性名是“小驼峰”形式,则绑定的时候,
建议改写成“连字符“ 格式 例如: cmtCount 建议写成 cmt-count-->
    <Count :init_count="9"></Count>

  </div>
</template>
<script>
  export default {}
</script>
<style lang="less" scoped>
  .left-container {
    padding: 0 20px 20px;
    background-color: orange;
    min-height: 250px;
    flex: 1;
  }
  h3{
    color: red;
  }
/*  在父组件中更改子组件中的样式 */
  /deep/h5{
    color: crimson;
  }

</style>
<template>
    <div>
        <h5>Count组件</h5>
        <span>count 值是 {{count}}</span>
        <br>
        <button @click="add1">+1</button>
        <button @click="count -= 1">-1</button>
    </div>
</template>
<script>
    export default {
        name: "Count",
        // props  是自定义属性,允许使用这通过自定义属性,当前组件指定初始值
        // 自定义属性的名字是封装者自定义的(只要名称合法即可)
        // props 中的数据,可以直接在模板结构中使用
        // props 是只读的,不可用直接修改,修改了会报错
        //
        // props:['init_count'],
        props:{
            //    在其中定义自定义属性
            init_count:{
                //如果外键使用  init_count 组件的时候,没有传递  init_count 属性,则默认值生效
                default:0,
                // init_count 的值类型  Number 数字
                type:Number,
                // 必填项校验,默认为 false
                required: true,
            }
        },
        data(){
            return{
                //this.init_count  通过this 获取组件属性的值
                count:this.init_count,
            }
        },
        methods:{
            add1(){
                this.count +=1;
            },
        }
    }
</script>
<style scoped>
</style>

当两个页面都使用了  scoped  那么需要修改子组件的  style 样式可以如下方式修改:


总结

vue 组件

1、组件化开发指的是:根据封装的思想,吧页面上可重用的   UI 结构进行封装为组件,从而方便项目的开发与维护。

2、组件的组成部分

  • template  --> 组件的  模板结构
  • script  --> 组件的   JavaScript 行为
  • style    --> 组件的  样式

3、组件之间的父子关系

4、使用组件的三个步骤

  • 步骤1:使用  import 语法导入需要的组件;
  • 步骤2: 使用  components  节点注册组件;
  • 步骤3: 以标签的形式使用刚才注册的组件

5、注册私有组件:在组件A 的components  节点下,注册了组件F,则在组件 F 只能在组件A 中;不能被 其他组件使用。

6、注册全局组件:在 vue 项目的  main.js  入口文件中,通过  Vue.commponent()  方法,可以注册全局组件。

7、组件  props  :props  是组件的自定义属性,在封装通用组件的时候,合理的使用  props  可以极大的提高组件的复用性.。

  • props  是自定义的属性,允许使用这通过自定义属性,当前组件指定初始值
  • 自定义属性的名字是封装者自定义的(只要名称合法即可)
  • 通过该属性穿过来的值可以通过    :   /   v-bind  进行属性绑定
  • props  是只读的,不要直接修改  props  的值,否则会报错
  • 要修改 props 的值,可以吧  props 的值转存到 data中,因为data 中的数据是可读可写的
  • 在声明自定义属性时,可以通过  default  来定义属性的默认值
  • 在声明自定义属性时,可以通过  type  来定义属性的值类型
  • props 的属性有,default  默认值,type  数据类型,requird  必填项
     

8、组件之间的样式冲突:通过在style 标签中增加 scoped 属性;

9、/deep/    样式穿透;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值