Vue 组件化开发

前端开发 作者: 2024-08-20 09:45:01
组件化开发 基本概念 在最开始的时候,已经大概的聊了聊Vue是单页面开发,用户总是在一个页面上进行操作,看到的不同内容也是由不同组件构成的。 通过用户的操作,Vue将会向用户展示某些组件,也会隐藏某些

组件化开发

认识组件

<body>
    <div id="app">

    </div>
    <script src="./vue.js"></script>
    <script>
        const app = new Vue({
            el:"#app",})
    </script>
</body>
<body>

<div id="app">
    <!-- 使用全局组件 -->
    <cpn-header></cpn-header>
    <cpn-header></cpn-header>
</div>

<script src="./vue.js"></script>
<script>
    // 定义组件名字与模板
    Vue.component("cpnHeader",{
        template: "<div><span>这是一个头部组件</span></div>",})
    const app = new Vue({
        el: "#app",})
</script>
</body>

组件声明

<body>

<div id="app">
    <!-- 使用全局组件 -->
    <cpn-header></cpn-header>
    <cpn-header></cpn-header>
</div>

<script src="./vue.js"></script>
<script>
    // 定义组件名字与模板
    Vue.component("cpnHeader",})
</script>
</body>
<body>

<div id="app">
    <cpn></cpn>
    <cpn></cpn>
</div>

<script src="./vue.js"></script>
<script>
    // 定义组件
    const cpn = {
        template:"<div><mark>HELLO,WORLD</mark></div>",}

    const app = new Vue({
        el:"#app",components:{  // 进行注册
            cpn,//es6语法
        }
    })
</script>
</body>

组件模板

    // 定义组件
    const cpn = {
        template: `
        <div>  
            <div>
                HELLO,VUE
            </div>
            <div>
                HELLO,WORLD
            </div>
        </div>
        `,}
<body>

<div id="app">
    <cpn></cpn>
    <cpn></cpn>
</div>

<template id="cpn">
    <div>
        <div>
            HELLO,VUE
        </div>
        <div>
            HELLO,WORLD
        </div>
    </div>
</template>

<script src="./vue.js"></script>
<script>

    const cpn = {
        template: "#cpn",}

    const app = new Vue({
        el: "#app",components: { 
            cpn,}
    })
</script>
</body>
<body>

<div id="app">
    <cpn-header></cpn-header>
    <cpn-header></cpn-header>
</div>

<!--子组件模板-->
<main id="cpn-header-template">
    <div>
    	<span>这是一个头部组件</span>
    </div>
</main>

<script src="./vue.js"></script>
<script>
    var cpnHeader = {
        template: "#cpn-header-template",}
    const app = new Vue({
        el: "#app",components: {  // Vue实例内部进行注册
            cpnHeader,}
    })
</script>
</body>

子组件的data

<body>

<div id="app">
    <cpn></cpn>
</div>

<template id="cpn">
    <div>
        <p>{{childrenMessage}}</p>
    </div>
</template>

<script src="./vue.js"></script>
<script>

    const cpn = {
        template: "#cpn",data() {
            return {
                childrenMessage: "子组件数据",}
        }
    }

    const app = new Vue({
        el: "#app",components: {
            cpn,}
    })
</script>
</body>

组件通信

<body>

<!--根组件模板-->
<div id="app">
    <father></father>
</div>

<!--子组件模板-->
<template id="son">
    <div>
<!--        ④ 子组件现在已经可以正常渲染出该值了,使用接收的变量名即可-->
        <p>{{childerRecv}}</p>
    </div>
</template>

<!--父组件模板-->
<template id="father">
    <div>
<!--② 子组件通过v-bind,将父组件中的值存储到props中,需要注意的是再模板中应该使用 - 进行多单词分割-->
        <son :childer-recv="fatherMessage"></son>
    </div>
</template>

<script src="./vue.js"></script>
<script>

    const son = {
        template: "#son",// ③ 现在子组件中已经用childerRecv这个变量名接收到父组件中传递过来的值了,需要注意的是接收时使用驼峰式命名进行接收,否则模板中不会渲染
        props: ["childerRecv",]
    }

    const father = {
        template: "#father",components: {
            son,},data() {
            return {
                // ① 父组件的作用域内能够接收到该值了
                fatherMessage: {id: 1,name: "yunya",age: 18},}
        }
    }


    const app = new Vue({
        el: "#app",components: {
            father,}
    })
</script>
</body>
<body>
<div id="app">
    <!-- 接收: - 分割命名 -->
    <cpn :recv-msg="sendMsg"></cpn>
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <!-- 使用: 与props同样的命名方式 -->
    <div><span>接收到的信息:{{recvMsg}}</span></div>
</template>

<script src="./vue.js"></script>
<script>
    var cpn = {
        // props:使用驼峰式命名,为了子组件模板中能够使用而不产生报错
        props: ["recvMsg",],template: "#cpn-template",data: function () {
            return {}
        }
    }
    const app = new Vue({
        el: "#app",data: {
            sendMsg: {
                id: 1,name: "admin",}
        },components: {  // Vue实例内部进行注册
            cpn,}
    })
</script>
</body>
验证项目 描述
type 一个Array,允许的类型
required 一个Boolen,是否必须传递
default 任意类型
validator 一个Function,返回需要验证的数据字段
<body>

<div id="app">
    <cpn :recv-msg="sendMsg"></cpn>
</div>

<!-- 模板 -->
<template id="cpn-template">
    <div><span>接收到的信息:{{recvMsg}}</span></div>
</template>

<script src="./vue.js"></script>
<script>
    var cpn = {
        props: {  // props是一个Object
            recvMsg: {  // 参数验证是一个Object
                // 允许的类型
                type: [Object,Array],// 是否是必须传递
                required: true,// 如果没有传递的默认值
                default() {
                    return "默认值";
                },// 验证,当验证失败后,会在调试台显示错误
                validator(v) {
                    // v就是父组件传递过来的数据
                    return v.id;
                },data: {
            sendMsg: {
                // id: 1,}
    })
</script>
</body>
<body>

<div id="app">
<!--    父组件监听add事件,并且交由fatherAdd进行处理-->
    <cpn @add="fatherAdd"></cpn>
    结果:{{showResult}}
    <!-- 结果显示在父组件 但是计算确是在子组件 -->
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <div>
        <input type="text" v-model.number="n1"> + <input type="text" v-model.number="n2">
        <button @click="sum">计算</button>
    </div>
</template>

<script src="./vue.js"></script>
<script>
    var cpn = {
        template: "#cpn-template",data() {
            return {
                n1: 0,n2: 0,methods: {
            sum() {
                let sonResult = this.n1 + this.n2;
                // 自定义了一个add事件,由父组件进行监听。并且传递了一个值
                this.$emit("add",sonResult);
            }
        }
    }
    const app = new Vue({
        el: "#app",data: {
            showResult: 0,methods: {
            fatherAdd(v) {
                this.showResult = v;
            }
        }
    })
</script>
</body>
<body>

<div id="app">
    <span>父组件的值:{{num}}</span>
    <cpn :son-num.sync="num"></cpn>
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <div>
        <span>子组件的值:{{sonNum}}</span>
        <p><input type="text" @keyup="changeValue" v-model="newValue" placeholder="输入新的值"></p>
    </div>
</template>

<script src="./vue.js"></script>
<script>
    
    var cpn = {
        props: ["sonNum",data: function () {
            return {
                newValue: this.sonNum,methods: {
            changeValue() {
                this.$emit("update:sonNum",this.newValue)
            }
        }
    }
    
    const app = new Vue({
        el: "#app",data: {
            num: 100,})
</script>
</body>

组件访问

<body>

<div id="app">
    <button @click="btn">父组件调用子组件方法</button>
    <cpn></cpn>
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <div>
        <span>{{msg}}</span>
    </div>
</template>

<script src="./vue.js"></script>
<script>

    var cpn = {
        template: "#cpn-template",data: function () {
            return {
                msg: "子组件show未调用",methods: {
            show() {
                this.msg = "子组件show已调用";
            }
        }
    }

    const app = new Vue({
        el: "#app",methods: {
            btn() {
                // 取出第0个子组件,进行调用其下方法
                this.$children[0].show();
            }
        }
    })
</script>
</body>
<body>

<div id="app">
    <button @click="btn">父组件调用子组件方法</button>
    <!-- 取名字 -->
    <cpn ref="nbcpn"></cpn>
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <div>
        <span>{{msg}}</span>
    </div>
</template>

<script src="./vue.js"></script>
<script>
    
    var cpn = {
        template: "#cpn-template",methods: {
            show() {
                this.msg = "子组件show已调用";
            }
        }
    }
    
    const app = new Vue({
        el: "#app",methods: {
            btn() {
                // 根据取的名字进行调用
                this.$refs.nbcpn.show();
            }
        }
    })
</script>
</body>
<body>

<div id="app">
    {{msg}}
    <cpn></cpn>
</div>

<!-- 子组件模板 -->
<template id="cpn-template">
    <div>
        <button @click="btn">子组件调用父组件方法</button>
    </div>
</template>

<script src="./vue.js"></script>
<script>
    
    var cpn = {
        template: "#cpn-template",data: function () {
            return {}
        },methods: {
            btn() {
                this.$parent.show();
            }
        }
    }
    
    const app = new Vue({
        el: "#app",data: {
            msg: "父组件show未调用",methods: {
            show() {
                // 取出自己的父组件,进行调用其下方法
                this.msg = "父组件show已调用";
            }
        }
    })
</script>
</body>

组件的动态切换

<body>

<div id="app">
    <div :is="choice"></div>
    <input type="radio" v-model="choice" value="inputCPN">文本框
    <input type="radio" v-model="choice" value="textareaCPN">文本域
</div>

<script src="./vue.js"></script>
<script>

    const inputCPN = {
        template: "<div><input type='text'/></div>",}

    const textareaCPN = {
        template: "<div><textarea></textarea></div>",data: {
            choice: "inputCPN",components: {
            inputCPN,textareaCPN,})
</script>
</body>

组件的钩子函数

钩子函数 描述
beforeCreate 创建Vue实例之前调用
created 创建Vue实例成功后调用(可以在此处发送异步请求后端数据)
beforeMount 渲染DOM之前调用
mounted 渲染DOM之后调用
beforeUpdate 重新渲染之前调用(数据更新等操作时,控制DOM重新渲染)
updated 重新渲染完成之后调用
beforeDestroy 销毁之前调用
destroyed 销毁之后调用
<div id="app">
    <p>{{msg}}</p>
</div>

<script src="./vue.js"></script>
<script>

    let app = new Vue({
        el: "#app",data:{
            msg:"HELLO,VUE",beforeCreate() {
            console.log("创建Vue实例之前...");
        },created() {
            console.log("创建Vue实例成功...");
        },beforeMount() {
            console.log("准备渲染DOM...");
        },mounted() {
            console.log("渲染DOM完成...");
        },beforeUpdate() {
            console.log("准备重新渲染DOM...");
        },updated() {
            console.log("重新渲染DOM完成");
        },// 后两个暂时体会不到
        beforeDestroy() {
            console.log("准备销毁当前实例");
        },destroyed() {
            console.log("当前实例销毁完成...");
        }
    })
</script>
</body>

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65447.html
Vue 组件化开发