07-Vue组件

1、局部组件和全局组件

    <div id="app">
        {{mess}}
        <abc></abc>
    </div>
<script>
        // 什么是组件?
        // 编写 可复用组件 的几个原则
        // 1. 以组件的功能命名
        // 2. 只负责ui 的展示和交互动画,不要在组件中与服务器打交道
        // 3 可复用组件不会因组件的位置,场景而发生变化,尽量减少对外部条件的依赖
        var head = Vue.extend({ // 继承出来一个vue 实例
            template: "<h2>{{message}}</h2>",
            data() {
                return {
                    message: "我是局部组件"
                }
            }
        })
        // 挂载到全局
        Vue.component("abc", head)

        var vm = new Vue({
            el: "#app",
            data: {
                mess: "我是父亲"
            },
            // components: { // 用来声明局部组件
            //     abc: head // 将组件head 重命名为abc
            // }
        })
        var vms = new Vue({
            el: "#two",
            data: {
                mess: "我是父亲"
            },
        })
    </script>

2、父传子

//当你创建一个组件时,那个组件名就是子组件
//当你创建一个Vue实例时,el需绑定div,那么这个div就是父组件
<div id="app">
        <input type="text" v-model="pMessage"><br>
        ===========上面是父组件 下面是子组件挂载================
        <!-- 使用子组件, 以下两种写法都可以 -->
        <!-- <my-component /> -->
        <my-component :my-msg="pMessage"></my-component>
</div>
<script>
    // 父组件 向 子组件 传值,  通过 props
    // 给子组件绑定一个自定义属性,在子组件内部使用 props 进行接收渲染父组件的传来的对应值
    const child = Vue.extend({ // 构造子组件
        template: `<div><p>{{ cMessage }}</p><button @click="change()">修改</button></div>`,
        props: ['myMsg'], // 在子组件中声明一个props属性,里面是 接收父组件数据的对应属性名
        data() {
            return {
                cMessage: 456
            }
        },
        methods: {
            change() {
                // 获取父组件中的值并使用
                this.cMessage = this.myMsg
            }
        }
    })
    new Vue({
        el: '#app',
        data() {
            // 局部组件注册在vue选项中,此时,data必须用return
            return {
                pMessage: 'Hello World'
            }
        },
        components: {
            myComponent: child
        }
    })
</script>

上述运行结果:

 

3、子传父

<div id="app">
        <p>{{ total }}</p> <br>
        ============================== <br>
        <!-- <button @click="increment()">{{ counter }}</button> -->
        <button-counter @c-add-emit="pTotalEmit" :step="1" />
    </div>
<script>
    // $http $refs $emit
    // 子组件向父组件传值, 通过事件调用实现, $emit
    // 给子组件绑定一个自定义事件,$emit 值是接收参数的函数.父组件函数接收的值就是子组件传递参数。要在子组件内部使用 this.$emit() 发送
    const child = Vue.extend({
        template: `<button @click="increment()">点击次数 {{ counter }}</button>`,
        props: ['step'],
        data() {
            return {
                counter: 0
            }
        },
        methods: {
            increment() {
                this.counter += this.step
                /**
                 * 
                 *let params =  {
                 *      name: this.name,
                 *      age: this.age,
                 *      counter: this.counter
                 * }
                 * this.$emit('c-add-emit', params)
                 */
                // 第一个参数:注册触发的事件名, 第二个参数: 需要传递的参数对象
                //实际上将我们真正要执行的那个函数留在了Vue对象里去实现,这样可以保证
                //组件的可复用性
                this.$emit('c-add-emit', this.counter)
            }
        }
    })
    const parent = new Vue({
        el: '#app',
        data() {
            return {
                total: 0
            }
        },
        components: {
            'button-counter': child
        },
        methods: {
            pTotalEmit(counter) {
                this.total = counter
            }
        }
    })
</script>

上述运行结果:

​​​​​​​

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七色的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值