Vue组件化开发-单文件组件

🔥Vue组件化开发🔥

组件化开发地址
🔥Vue组件化开发https://blog.csdn.net/m0_55990909/article/details/123957131
🔥Vue组件化开发-单文件组件https://blog.csdn.net/m0_55990909/article/details/123957171

单文件组件

1、单文件组件

1.在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素。

2.这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的项目中,或者你的前端完全由 JavaScript 驱动的时候,下面这些缺点将变得非常明显

  • 全局定义 (Global definitions) 强制要求每个 component 中的命名不得重复
  • 字符串模板 (String templates) 缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \
  • 不支持 CSS (No CSS support) 意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
  • 没有构建步骤 (No build step) 限制只能使用 HTML 和 ES5 JavaScript,而不能使用预处理器,如 Pug (formerly Jade) 和 Babel

3.文件扩展名为 .vuesingle-file components (单文件组件) 为以上所有问题提供了解决方法,并且还可以使用 webpack 或 Browserify 等构建工具。

直接将组件分离出来,作为一个单独的文件。

2、使用单文件组件的三个步骤

  • Left单文件组件配置
//文件名为Left.vue
<template>
  <div>
    <h3>Left 组件</h3>
    <p>组件的值是:{{ msg }}</p>
  </div>
</template>

<script>
//默认导出 固定写法
export default {
  //data数据源  类型为函数
  data(){
  	return{
   		msg: 'left' 	
  	}
  }
}
</script>

<style lang="less" >
</style>
  • 在根组件App.vue引用Left.vue单文件组件

3、单文件组件之间的通信(数据交互)

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

父子组件是两个封闭的作用域

父组件为User.vue

子组件为status.vue,detail.vue

3.2 父组件往子组件里面传值

1.在子组件中自定义可以接收的属性:

<script>
export default{
  props:['name']//props:['name','age']可以传多个自定义属性
}
</script>

2.在父组件中引用子组件

<template>
<app-status
   :name="name"></app-status>
</template>
<script>
//引入
import Status from "./status.vue"
export default{
  data(){
   return{
       name:"zcy"
     }
  },
  //注册
  components:{
    "app-status":Status
  } 
}
</script>

3.这时候,我们就可以在子组件中使用这个name了

<template>
<div>
	<p>{{name}}</p>
</div>
</template>

4.如果我们直接改变props的name属性的值,会报错(怕我们数据流发生混乱),所以我们要定义一个属性初始化这个传过来的name

<template>
<div>
<p>{{myName}}</p>
<p>{{changeName()}}</p>
</div>
</template>
<script>
export default{
  props:['name'],
  data(){
   return{
     myName=this.name
    }
  },
  methods:{
   changeName:function(){
     this.myName='xiaoming';
    }
  }
 
}
</script>

5.props验证,可以传一个也可以传多个,必须传required:true,default:‘daming’ 这两个只能存在一个,必传或者默认

<script>
export default{
  //props:['name'],
  props:{
   name:String,
   name:[String,Array,Number],
   name:{
    type:String,
    required:true//必须传,存其一
    default:'daming'//默认,存其一
   },
   //如果是Object
    name:{
    type:Object,
    //required:true//必须传,存其一
    default(){
     return{
      
     }
    }
   },
   //age:Number
  },
  data(){
   return{
     myName=this.name
    }
  },
  methods:{
   changeName:function(){
     this.myName='xiaoming';
    }
  }
 
}
</script>
3.3 子组件往父组件里面传值

1.在子组件中绑定上点击事件,然后通过**$emit触发自定义的事件(事件名和值)**

<template>
<div>
<p>{{myName}}</p>
<p>{{changeName()}}</p>
<p><button @click="changePName">改变父级的name</button></p>
</div>
</template>
<script>
export default{
  props:{
    name:{
       type:String
     }
   },
  data(){
   return{
     myName=this.name
    }
  },
  methods:{
   changeName:function(){
     this.myName='xiaoming';
    },
   changePName:function(){
      this.$emit('changePName','xiaohuang');
    }
  }
 
}
</script>

2.在父组件中绑定上这个自定义的事件

<template>
<app-status
   :name="name"
   @changePName="changeName"></app-status>
</template>
<script>
//引入
import Status from "./status.vue"
export default{
  data(){
   return{
       name:"zcy"
     }
  },
  //注册
  components:{
    "app-status":Status
  },
  methods:{
   changeName:function(name){
     this.name=name;
   }
  } 
}
</script>
3.4 兄弟组件传值

绑定和触发全局事件(EventBus)

1.在main.js中注册一个新的Vue实例

export const EventBus=new Vue()

2.在子组件status.vue中引入这个EventBus,这个子组件去改变另一个兄弟子组件

<template>
<div>
<p>{{age}}</p>
<p><button @click="changeAge">改变兄弟值</button></p>
</div>
</template>
<script>
import {EventBus} from "./main.js"
export default{
 data(){
  return{
    age:10
  }
 },
 methods:{
  changeAge:function(){
   this.age=20;
   EventBus.$emit("editAge",this.age);//全局触发自定义事件
  }
 } 
}
</script>

3.在子组件detail.vue中去引入EventBus,通过**$on绑定上自定义事件**

<template>
<div>
<p>{{age}}</p>
</div>
</template>
<script>
import {EventBus} from "./main.js"
export default{
 data(){
  return{
    age:10
  }
 },
 methods:{
 
 },
create(){
  EventBus.$on("editAge",(age)=>{
   this.age=age;
  });//绑定自定义事件 
 } 
}
</script>
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值