美文网首页
VUE03--{组件、生命周期}

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

作者: MickeyMcneil | 来源:发表于2018-08-12 14:35 被阅读26次

1.创建组件

  • Vue.extend、Vue.component结合创建
    <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>
  • Vue.component创建
    <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创建
    <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实例观察的数据对象

  • beforeCreate
    实例初始化之后被调用。
    实例未完成配置:数据观测(data observer)和event/watch配置。
  • created
    实例创建完成后立即被调用。
    实例已完成配置:
    1.数据观测(data observer)
    2.属性和方法的运算
    3.watch/event事件回调
    实例未完成配置:挂载阶段未开始,dom未生成,$el属性不可见。
  • beforeMount
    模板编译挂载前被调用。
    过程:判断el => 判断template属性 => 生成vm.$el,但指令未被解析
  • mounted
    模板编译挂载之后调用。
    过程:vm.$el替换掉el指向的DOM
  • beforeUpdate
    因为数据变更,从而导致虚拟DOM重新渲染,之前调用。
  • updated
    因为数据变更,从而导致虚拟DOM重新渲染,之后调用。
  • beforeDestroy
    实例销毁之前调用。
    此时,实例完全可以正常使用。
  • destroyed
    vue实例指向的所有东西解除绑定,包括watcher、事件、所有子组件。


    生命周期图解(部分)

相关文章

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

    1.创建组件 Vue.extend、Vue.component结合创建 Vue.component创建 templ...

  • 1组件的生命周期

    组件的生命周期:组件从创建到销毁的过程称为组件的生命周期。组件的生命周期通常分为三个阶段: 组件的挂在阶段。 组件...

  • Flutter 生命周期研究与应用

    Flutter 生命周期包括了组件的生命周期以及App的生命周期。 一、组件生命周期 一个flutter组件主要分...

  • 进阶react.js

    组件生命周期 组件的生命周期有助于理解组件的运行方式,完成更复杂的组件功能、分析组件错误原因等组件的生命周期: 组...

  • 二、Lifecycle

    使用生命周期感知组件处理生命周期 生命周期感知组件可以在其他组件(例如 activity 和 fragment)的...

  • React 生命周期

    React 生命周期 初始化周期 组件重新渲染生命周期 组件卸载生命周期

  • React 组件生命周期

    组件生命周期 参考阅读: component-lifecycle react组件生命周期过程说明 react 组件...

  • React概念图

    React概念图 React组件生命周期概念图 参考文档:React入门教程 组件生命周期React:组件生命周期...

  • 2、Android官方架构组件介绍之LifeCycle(一)

    Android官方架构组件介绍之LifeCycle 使用生命周期感知组件处理生命周期 支持生命周期的组件会响应另一...

  • React总结

    [toc] 1.React组件生命周期 1.1 生命周期图 组件的生命周期的图如下: 具体可参考React 组件生...

网友评论

      本文标题:VUE03--{组件、生命周期}

      本文链接:https://www.haomeiwen.com/subject/ecusbftx.html