zoukankan      html  css  js  c++  java
  • vue之组件(组件之间相互传参)

    1.全局注册组件

    Vue.component('button-cart',{
     data () {
      return {
        count: 1
      }
      },
      template: '<button @click="count++">{{ count }}</button>'
    })
    new Vue({el: '#app'})

      组件中的data必须是一个函数

    2. 局部注册组件

        // 局部组件
        const Buttoncart = {
          template: '<button>局部的组件<button>'
        }
        new Vue({
          el: '#app',
          components: {
            Buttoncart
          }
        })
     // 另一种写法  推荐
     <template id="cart">
        <div>呵呵哒
          <ul>
            <li>小王</li>
            <li>小丽</li>
          </ul>
        </div>
      </template>
        const Buttoncart = {
          template: '#cart'
        }
        new Vue({
          el: '#app',
          components: {
            Buttoncart
          }
        })

    组件之间相互传值

    3.父组件给子组件传值

      父组件在调用子组件的地方,给它添加一个自定义属性,这个自定义属性的值就是父组件需要传递给子组件的值,如果这个值是一个变量的话需要用到绑定属性,,,,在子组件的内部添加一个props,这个props就是用来描述接收父组件的值

      props有三种写法

      1.数组的方法 props[data,flag]  数组元素就是自定义属性名

      2.对象方法 props:{ data: Array }   key值为自定义的属性名,value值为数据类型

      3.也是对象方法 props: { data: { type: Array, defualt: () { return [] } } }

        key值为自定义的属性名,value值为一个对象,在此对象下,第一个key为type,value值为数据类型,第二个key值为 default,value值为默认值,如果默认的数据是数组或者对象,需要使用函数,返回默认值

    <div id="app">
        <Buttoncsrt></Buttoncsrt>
      </div>
      <script>
        const nav = {
          // 子组件
          props: {
            data: {
              type: Array,
              defualt: () => {
                // 如果是一个数组或者对象需要使用函数返回
                return []
              }
            }
          },
          template: '<div><P v-for="(item, index) of data" :key="index">{{ item }}</P></div>'
        }
        const Buttoncsrt = {
          // 父组件
          data () {
            return {
              list: [1,6,8,9]
            }
          },
          // 父组件调用子组件的地方
          template: '<my-body :data="list"></my-body>',
          components:{
            'my-body': nav
          }
        }
        new Vue({
          el: '#app',
          components: {
            Buttoncsrt
          }
        })

    4.子组件给父组件传值

      在父组件调用子组件的地方,绑定自定义事件名的事件,此事件由父组件实现,注意绑定事件不加(),方法实现有默认参数,此参数的值就是子组件传递过来的值

    <div id="app">
            <my-body></my-body>
        </div>
        <template id="nav">
            <div><button @click="senddata('111')">改变为111</button>
                <button @click="senddata('222')">改变为222</button>
                <button @click="senddata('333')">改变为333</button>
                <button @click="senddata('444')">改变为444</button>
            </div>
        </template>
        <template id="comp">
            <div>
                呵呵 {{ nun }}
                <!-- 啥也不写设置了默认值的话显示默认值 -->
                <my-nav @my-eve='getdata'></my-nav>
            </div>  
        </template> 
        <script>    
        // 在子组件中,通过某一个事件触发,执行以下事件
      // this.$emit(自定义事件名, 传递的参数)
      // 在父组件调用子组件的地方,绑定 自定义事件名 的事件,此事件由 父组件实现,注意绑定事件不加(),方法实现有默认参数,此参数的值就是子组件传递过来的值
            var nav = { //子组件
                template: '#nav',
                methods: {
                    senddata(val){
                        this.$emit('my-eve' , val)
                    }
                }
            }
            var coent = {//父组件
                template: '#comp',
                data(){
                    return {
                        list: [2,6,89,74,23],
                        nun : '111'
                    }
                },
                components: {
                    'my-nav': nav
                },
                methods: {
                    getdata(val){
                        this.nun = val
                    }
                }
            }
            var app = new Vue({
                el: '#app',
                components: {
                    'my-body': coent
                }
            })
        </script>

    5.非父子之间传值

        <div id="app">
            <my-body></my-body>
            <my-nav></my-nav>
        </div>
        <template id="nav">
            <div><button @click="senddata('111')">改变为111</button>
                <button @click="senddata('222')">改变为222</button>
                <button @click="senddata('333')">改变为333</button>
                <button @click="senddata('444')">改变为444</button>
            </div>
        </template>
        <template id="comp">
            <div>
                呵呵 {{ nun }}
            </div>  
        </template> 
        <script>    
        // 非父子组件之间传值 --- 中央事件总线
        // new Vue实例作为中央事件总监 const bus = new Vue()
        // 在需要传递数据的一方,通过以下代码传递数据
        // bus.emit(自定义事件名, 传递的数据) // 在需要接受数据的一方,通过以下代码接收数据 // bus.on(自定义事件名, function (val) {})
        const bus = new Vue()
        var nav = {
            template: '#nav',
            methods: {
                senddata(val){
                  bus.$emit('my-eve' , val)
                }
            }
        }
        var coent = {
            template: '#comp',
            data(){
                return {
                    list: [2,6,89,74,23],
                    nun : '111'
                }
            },
            mounted () {
                bus.$on('my-eve', val => {
                  this.nun = val
                })
            }
        }
        var app = new Vue({
            el: '#app',
            components: {
                'my-body': coent,
                'my-nav': nav
            }
        })
        </script>
  • 相关阅读:
    Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
    Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
    Azure China (7) 使用WebMetrix将Web Site发布至Azure China
    Microsoft Azure News(4) Azure新D系列虚拟机上线
    Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
    Windows Azure Cloud Service (37) 浅谈Cloud Service
    Azure PowerShell (6) 设置单个Virtual Machine Endpoint
    Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机
    功能代码(1)---通过Jquery来处理复选框
    案例1.用Ajax实现用户名的校验
  • 原文地址:https://www.cnblogs.com/dcyd/p/12635108.html
Copyright © 2011-2022 走看看