• Vue组件(component)


    Vue推荐开发方式是:SPA(single page (web) application)单页面web应用,一个应用中只能存在一个vue实例

    严格使用spa存在的问题?

    • a.一个页面功能越来越多,代码越多不利于维护
    • b.功能增多,页面加载全部功能导致性降低

    为处理spa存在的问题,vue引出组件的概念(component)

    • 一个组件负责完成项目中一个功能或者一组功能的是实现,保证业务隔离
    • 组件还能够复用

    组件使用:

    • 全局组件:直接注册vue根实例组件
    1. // 参数1:组件名称 参数2:组件的配置对象
    2. Vue.component("login", {
    3. template:`

      用户登录

      `
      // 用来书写该组件的html代码
    4. }) // 全局组件,任何地方都可用
    5. //使用组件
    • 局部组件:只能在注册组件中使用组件
    1. new Vue({
    2. el: "#app",
    3. data: {},
    4. ...
    5. components:{
    6. add:{ // 注册局部组件
    7. template:`

      用户添加

      `
    8. data(){ // 用来定义组件自己的数据 ,然后再template的html代码中可以直接用{{}}进行取值
    9. return {}
    10. },
    11. methods:{}, // 用来定义自己的相关方法
    12. computed:{}, // 用来定义自己的计算属性
    13. components:{}, // 用来定义自己的子组件
    14. beforeCreate(){} // 用来定义自己的生命周期方法
    15. ....
    16. }
    17. } // 只能在当前组件中使用局部组件
    18. })
    19. // 使用局部组件

    注意:无论使用全局组件还是局部组件都必须在template中加入唯一根元素,例如:

    父组件向子组件传值:

    • 传递静态数据,则在组件使用标签上声明静态数据即可,例如key=value,在组件定义内部使用props进行接收数据即可
    1. <login title="我是标题">login> # key=value 传递静态数据
    2. const app = new Vue({
    3. el:"#app",
    4. data:{},
    5. components:{ // 创建子组件
    6. login:{
    7. template:`<div><h3>用户登录组件-->{{title}}h3>div>`, // 使用title
    8. data(){return {}},
    9. props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
    10. }
    11. }
    12. })
    • 传递动态数据,用v-bind或者v-model即可,使用跟静态数据传递使用方式一样
    1. <login :title="title">login> # v-bind方式
    2. <input type="text" v-model="title"> # v-model方式
    3. const app = new Vue({
    4. el:"#app",
    5. data:{
    6. title: 我是vue实例管理数据(动态数据)
    7. },
    8. components:{ // 创建子组件
    9. login
    10. }
    11. })
    12. // 将组件拎出来写也可以
    13. const login={
    14. template:`<div><h3>用户登录组件-->{{title}}h3>div>`, // 使用title
    15. data(){return {}},
    16. props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
    17. }

    事件传递:

    在使用组件时向子组件传递事件,直接在对应组件标签上定义传递事件即可,例如:@传递事件名="父组件中传递事件名"(@key=value)

    1. <login :title="title" @testParent="testParent">login> # v-bind方式
    2. const app = new Vue({
    3. el:"#app",
    4. data:{
    5. title: 我是vue实例管理数据(动态数据)
    6. },
    7. methods:{
    8. // 定义父组件中事件
    9. testParent(){
    10. alert("我是父组件上事件")
    11. }
    12. }
    13. components:{ // 创建子组件
    14. login
    15. }
    16. })
    17. // 将组件拎出来写也可以
    18. const login={
    19. template:`<div><h3>用户登录组件-->{{title}}<button @click="testChild">点我去调父组件中某个事件button>h3>div>`, // 使用title
    20. data(){return {}},
    21. props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
    22. methods:{
    23. testChild(){
    24. alert("我是子组件中定义事件")
    25. // 调用父组件中testParent事件
    26. this.$emit("testParent") // 这个方法用来调用父组件传递过来事件 参数1:调用事件名
    27. }
    28. }
    29. }

    子组件向父组件传值:

    通过定义传递事件的形式,将子组件中需要传递的值通过事件参数的形式传向父组件即可

    1. <login :title="title" @aaa="testParent">login> # v-bind方式
    2. const app = new Vue({
    3. el:"#app",
    4. data:{
    5. title: 我是vue实例管理数据(动态数据)
    6. count: 0 // 定义父组件需要接收子组件的参数
    7. },
    8. methods:{
    9. // 定义父组件中事件
    10. testParent(count){
    11. alert("我是父组件上事件")
    12. this.count=count // 接收子组件参数
    13. }
    14. }
    15. components:{ // 创建子组件
    16. login
    17. }
    18. })
    19. // 将组件拎出来写也可以
    20. const login={
    21. template:`<div><h3>用户登录组件-->{{title}}<button @click="testChild">点我去调父组件中某个事件button>h3>div>`, // 使用title
    22. data(){
    23. return {
    24. counter: 12 // 子组件中定义的参数,将这个参数传回父组件
    25. }
    26. },
    27. props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
    28. methods:{
    29. testChild(){
    30. alert("我是子组件中定义事件")
    31. // 调用父组件中aaa事件
    32. this.$emit("aaa", this.counter) // 这个方法用来调用父组件传递过来事件 参数1:调用事件名, 参数2, 参数3
    33. // this.$emit("bb", {id:1, name:2}) // 传递一个对象也可以
    34. }
    35. }
    36. }

    组件插槽(slot):

    作用:用来扩展现有组件,让组件更灵活使用

    具名插槽:带有名字插槽

    1. <login>login> # 未使用插槽
    2. <hr>
    3. <login><span slot="bb">欢迎进入我们网站span>login> #使用插槽bb
    4. <hr>
    5. <login><span slot="aa">welcome to websitespan>login> # 使用插槽aa
    6. const app = new Vue({
    7. el:"#app",
    8. data:{},
    9. components:{ // 创建子组件
    10. login
    11. }
    12. })
    13. // 将组件拎出来写也可以
    14. const login={
    15. template:`<div><slot name="aa">slot><h3>用户登录h3><slot name="bb">slot>div>`, // 定义两个插槽 aa和bb
    16. data(){return {}}
    17. }

  • 相关阅读:
    安利一个简单实用的小技巧:图片怎么批量改尺寸
    用户角色权限、按钮控制功表及返回数据格式
    Java 的反射
    深入了解移动端适配的方案
    【凸优化学习笔记1】什么是优化、优化的数学表达形式
    ChatGPT怎么运用在文学分析和文化研究中?
    字符串函数(二)
    Go-Zero 业务开发军火库
    十年回望,中国物联网平台消亡史
    Adversarial Dynamic Shapelet Networks(AAAI2020)
  • 原文地址:https://blog.csdn.net/weixin_40123451/article/details/126746306