VUE03--{组件、生命周期}

2018-08-12  本文已影响26人  MickeyMcneil

1.创建组件

    <div id="app">
        <index-a></index-a>
    </div>
    <script>
        // 方法1
        var index = Vue.extend({
            template: "<div>我是方法1创建的模板</div>"
        })
        Vue.component("indexA", index);
        var vm = new Vue({
            el: "#app",
        })
    </script>
    <div id="app">
        <index-b></index-b>
    </div>
    <script>
        // 方法2
        Vue.component("indexB", {
            template: "<div>我是方法2创建的模板</div>"
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>
    <template id="text">
        <div>我是方法3创建的模板</div>
    </template>
    <div id="app">
        <index-c></index-c>
    </div>
    <script>
        // 方法3
        Vue.component("indexC", {
            template: "#text"
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

注意

  1. template只能有一个根节点。
  2. 组件如果用驼峰命名,例如indexA,使用时用连字符"-",例如index-a。

2.组件中的指令和事件

    <div id="app">
        <index></index>
    </div>
    <script>
        Vue.component("index", {
            template: "<div>{{msg}}<button @click='changeMsg'>点击</button></div>",
            data () {
                return {
                    msg: "今天多少号?"
                }
            },
            methods: {
                changeMsg () {
                    this.msg = "今天2月31";
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

注意

  1. 组件中可以使用vue实例中的大多数选项,但是data必须写成方法。

3.创建父子组件

    <div id="app">
        <father></father>
    </div>
    <script>
        Vue.component("father", {
            template: "<div>我是爸爸<son></son></div>",
            components: {
                son: {
                    template: "<div>我是儿子</div>",
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

注意

  1. 创建:通过components属性创建,子组件是对象。
  2. 使用:在template中,父组件 包含 子组件,如果是平级,则会报错

4.父组件传值给子组件

    <div id="app">
        <father></father>
    </div>
    <script>
        Vue.component("father", {
            template: "<div>我是爸爸,儿子名叫{{sonName}}<son :myName='sonName'></son></div>",
            data () {
                return {
                    sonName: "benny",
                }
            },
            components: {
                son: {
                    props: ["myName"],
                    template: "<div>我是儿子,名叫{{myName}}</div>",
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

传值的过程:


父组件传值给子组件

5.子组件传值给父组件

    <div id="app">
        <father></father>
    </div>
    <script>
        Vue.component("father", {
            template: `
                <div>我儿子的名字叫做{{sonName}}
                    <son @tellName='getName'></son>
                </div>
            `,
            data () {
                return {
                    sonName: "....",
                }
            },
            methods: {
              getName (data) {
                  this.sonName = data;
              }  
            },
            components: {
                son: {
                    template: `<button @click='emitName'>告诉他我叫{{name}}</button>`,
                    data () {
                        return {
                            name: "舒克",
                        }
                    },
                    methods: {
                        emitName () {
                            return this.$emit("tellName", this.name);
                        }
                    }
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

传值的过程:


子组件传值给父组件

注意

  1. 子组件需要用$emit(param1, param2)方法来传值 :param1 -- 事件名称 | param2 -- 需要传递的数据
  2. 父组件用getName(param)来接收值,param是默认参数,表示从子组件传递的值。

6.兄弟组件之间传值

    <div id="app">
        <father></father>
    </div>
    <script>
        // 创建空vue实例,作为事件总线
        var eventbus = new Vue();
        Vue.component("father", {
            template: `<div>
                <bro></bro>
                <sis></sis>
            </div>`,
            components: {
                bro: {
                    template: `<div>我妹妹叫{{sisName}}</div>`,
                    data () {
                        return {
                            sisName: "....",
                        }
                    },
                    mounted () {
                        // eventbus.$on可以监听兄弟节点发射过来的事件
                        // eventbus.$on有两个参数,参数1--“事件名称”,参数2--“函数(参数即为传递过来的数据)”
                        eventbus.$on("tellBroMyName", data => {
                            this.sisName = data;
                        })
                    }
                },
                sis: {
                    template: `<button @click="emitMyName">我叫{{myName}}</button>`,
                    data () {
                        return {
                            myName: "花泽香菜",
                        }
                    },
                    methods: {
                        emitMyName () {
                            // 通过事件总线,发射事件名称和值
                            eventbus.$emit("tellBroMyName", this.myName);
                        }
                    }
                }
            }
        })
        var vm = new Vue({
            el: "#app",
        })
    </script>

传值的过程:


兄弟组件之间传值

注意

  1. bro和sis是兄弟关系,作用域不同,所以要通过eventbus来传值,eventbus相当于“中介”。

6.动态创建组件

    <div id="app">
        <ul>
            <li @click="currentComponent = 'movie'"><a href="#">影评</a></li>
            <li @click="currentComponent = 'book'"><a href="#">书评</a></li>
            <li @click="currentComponent = 'drama'"><a href="#">剧评</a></li>
        </ul>
        <!-- 利用component标签创建动态组件,is属性指向谁,就显示哪个组件 -->
        <component :is="currentComponent"></component>
    </div>
    <script>
        // 影评组件
        Vue.component("movie", {
            template: `<div>荒岛余生</div>`,
        })
        // 书评组件
        Vue.component("book", {
            template: `<div>百年孤独</div>`,
        })
        // 剧评组件
        Vue.component("drama", {
            template: `<div>开心麻花剧场</div>`,
        })

        var vm = new Vue({
            el: "#app",
            data: {
                currentComponent: "",
            },
        })
    </script>

7.局部过滤器和局部自定义属性

    <div id="app">
        <fil></fil>
        <direc></direc>
    </div>
    <script>
        // 全局自定义指令
        Vue.directive("pinkfont", {
            inserted (el, binding) {
                el.style.color = binding.value
            }
        })
        Vue.component("fil", {
            data() {
                return {
                    time: new Date(),
                    color: "pink",
                }
            },
            template: `
                    <div>
                        <p>{{time | formatTime}}</p>
                        <input type="text" v-pinkfont="color" > 
                    </div>
            `,
            // 局部过滤器
            filters: {
                formatTime(ctime) {
                    let y = ctime.getFullYear();
                    let m = ctime.getMonth() + 1;
                    let d = ctime.getDate();
                    return y + "/" + m + "/" + d;
                }
            }
        })
        Vue.component("direc", {
            data() {
                return {
                    time: new Date(),
                    color: "pink",
                }
            },
            template: `
                    <div>
                        <p>{{time}}</p>
                        <input type="text" v-focus v-pinkfont="color" >
                    </div>
            `,
            // 局部自定义指令
            directives: {
                focus: {
                    inserted (el, binding) {
                        el.focus();
                    }
                }
            }
        })

        var vm = new Vue({
            el: "#app",
        })
    </script>

注意

  1. 全局自定义指令和全局过滤器可以在任何组件中使用。
  2. 局部指定和局部过滤器,只能在当前组件中使用,脱离当前组件则无效。

8.生命周期

$el -- vue实例使用的根DOM元素

$data -- vue实例观察的数据对象

上一篇下一篇

猜你喜欢

热点阅读