Vue3 组件
 一、组件理论

 二、创建组件
<template>
    <div>欧阳克</div>
    
    
    
    <OneCom></OneCom>
    <one-com></one-com>
</template>
<script>
import OneCom from './components/OneCom';
export default {
    
    components:{
        
        OneCom : OneCom,
        
        
    }
};
</script>
<template>
    <div>OneCom组件文件</div>
</template>
<script>
export default {
    name : "OneCom"
};
</script>
 三、子组件
<template>
    <div>OneCom组件文件</div>
    
    <two-com></two-com>
</template>
<script>
import TwoCom from './TwoCom';
export default {
    name : "OneCom",
    
    components:{
        TwoCom
    }
};
</script>
<template>
    <div>TwoCom组件文件</div>
</template>
<script>
export default {
    name : "TwoCom"
};
</script>
 四、使用多组件
<template>
    <div>
        <div>欧阳克</div>
        <one-com></one-com>
        <two-com></two-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom.vue";
import TwoCom from "./components/TwoCom.vue";
export default {
    components: {
        OneCom,
        TwoCom
    }
};
</script>
<template>
    <div>OneCom组件文件</div>
</template>
<script>
export default {
    name : "OneCom"
};
</script>
<template>
    <div>TwoCom组件文件</div>
</template>
<script>
export default {
    name : "TwoCom"
};
</script>
 五、属性传值给组件
 1、属性传值
<template>
    <div>欧阳克</div>
    
    <one-com title="php中文网"></one-com>
    
    <one-com :title="title" :msg="msg" :arr="arr" :ob="ob"></one-com>
</template>
<script>
import OneCom from "./components/OneCom.vue";
export default {
    name: "Phpcn",
    data() {
        return {
            title: "使用变量的方式传值",
            msg: "消息",
            arr : [
                '欧阳克',
                '朱天蓬',
                '灭绝师太'
            ],
            ob: {
                name: "欧阳克",
                age: "38岁"
            }
        };
    },
    components:{
        OneCom : OneCom
    }
};
</script>
<template>
    <div>
        <div>{{ title }}</div>
        <div>{{ msg }}</div>
        <div>{{ arr }}</div>
        <div>{{ ob }}</div>
    </div>
</template>
<script>
export default {
    name: "App",
    data() {
        return {
        };
    },
    
    props: ["title", "msg", "arr", "ob"]
};
</script>
 2、接收传值并限制数据
<template>
    <div>
        <one-com :title="title" :msg="msg" :arr="arr" :ob="ob"></one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom.vue";
export default {
    components: {
        OneCom,
    },
    data() {
        return {
            title: "使用变量的方式传值",
            msg: "消息",
            arr : [
                '欧阳克',
                '朱天蓬',
                '灭绝师太'
            ],
            ob: {
                name: "欧阳克",
                age: "38岁"
            }
        };
    },
};
</script>
<template>
    <div>
        <div>{{ title }}</div>
        <div>{{ msg }}</div>
        <div>{{ arr }}</div>
        <div>{{ ob }}</div>
    </div>
</template>
<script>
export default {
    data() {
        return {};
    },
    
    props: {
        title: {
            type: String,
            default: function () {
                return "php中文网";
            },
            required : true
        },
        msg: {
            type: String,
            default: "默认msg",
        },
        arr: {
            type: Array,
            default: function () {
                return ["欧阳克","朱天蓬"];
            }
        },
        ob: {
            type: Object,
            default: function () {
                return { name: "朱天蓬", age: "48岁" };
            }
        }
    }
};
</script>
<template>
    <div>{{teacher}}</div>
    <one-com @app_edit="app_edit"></one-com>
</template>
<script>
import OneCom from './components/OneCom';
export default {
    data() {
        return {
            teacher : "欧阳克"
        };
    },
    components: {
        OneCom,
    },
    methods : {
        app_edit(e){
            console.log('我是父文件的app_edit方法');
            this.teacher = e;
        }
    }
};
</script>
<template>
    <div>
        <button @click="edit('朱天蓬')">传给父文件</button>
        <button @click="edit('灭绝师太')">传给父文件</button>
    </div>
</template>
<script>
export default {
    data() {
        return {
        };
    },
    methods : {
        edit(teacher){
            console.log('我是子文件的edit方法');
            this.$emit('app_edit',teacher);
        }
    }
};
</script>
 3、父子组件之间相互访问 $parent
<template>
    <one-com></one-com>
</template>
<script>
import OneCom from './components/OneCom';
export default {
    data() {
        return {
        };
    },
    components: {
        OneCom
    },
    methods : {
        app_fun() {
            console.log("我是app.vue文件的app_fun方法");
        }
    }
};
</script>
<template>
    <div>{{ one_fun() }}</div>
</template>
<script>
export default {
    data() {
        return {};
    },
    methods: {
        one_fun() {
            console.log("我是子组件的one_fun方法");
            
            this.$parent.app_fun();
            
            this.$parent.$parent.app_fun();
            
            this.$root.app_fun();
        }
    }
};
</script>
<template>
    <div>子组件</div>
</template>
<script>
export default {
    data() {
        return {};
    },
    methods: {
        one_fun() {
            console.log("我是子组件的one_fun方法");
        }
    }
};
</script>
<template>
    <div>
        
        <one-com ref="one" @click="app_fun()"></one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    data() {
        return {};
    },
    components: {
        OneCom
    },
    methods: {
        app_fun() {
            
            this.$refs.one.one_fun();
            console.log("我是app.vue文件的app_fun方法");
        }
    }
};
</script>
 4、插槽
<template>
    <div>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <slot></slot>
    </div>
</template>
<template>
    <div>
        
        <one-com>
            <button>按钮</button>
        </one-com>
        
        <one-com>
            <a>a链接</a>
        </one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    data() {
        return {};
    },
    components: {
        OneCom
    }
};
</script>
<template>
    <div>
        <slot></slot>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        
        <slot name="two"></slot>
    </div>
</template>
<template>
    <div>
        <one-com>
            <button>按钮</button>
            
            <template v-slot:two>
                <button>按钮</button>
            </template>
        </one-com>
        <one-com>
            <a>a链接</a>
            
            <template 
                <a>a链接</a>
            </template>
        </one-com>
        <one-com>
            
            <template v-slot:default>
                <a>a标签</a>
            </template>
        </one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    components: {
        OneCom,
    }
};
</script>
<template>
    <div>
        <slot>第一个插槽</slot>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <slot name="two">第二个插槽</slot>
    </div>
</template>
<template>
    <div>
        <slot></slot>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <slot name="two" :php="php"></slot>
    </div>
</template>
<script>
export default {
    data() {
        return {
            php: "PHP中文网"
        }
    }
};
</script>
<template>
    <div>
        <one-com>
            <button>按钮</button>
            
            <template v-slot:two="data">
                <button>按钮{{ data.php }}</button>
            </template>
        </one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    components: {
        OneCom
    }
};
</script>
 三、文件样式
<template>
    
    <div class="red">{{ name }}</div>
    <div>
        
        <div class="red">{{ name }}</div>
    </div>
</template>
<script>
export default {
    data() {
        return {
            name: "欧阳克"
        }
    }
};
</script>
<template>
    <div>
        <div class="red">php中文网</div>
        <one-com></one-com>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    components: {
        OneCom
    }
};
</script>
<style scoped>
.red {
    color: red;
}
</style>
<style scoped lang="scss">
    
</style>
 四、组件生命周期


<template>
    <div>欧阳克</div>
</template>
<script>
export default {
    beforeCreate() {
        console.log("1在创建组件之前调用");
    },
    created() {
        console.log("2组件创建完成调用");
    },
    beforeMount() {
        console.log("3模版挂载之前调用");
    },
    mounted() {
        console.log("4模版挂载完成调用");
    }
};
</script>
<template>
    <div>
        <input type="text" v-model="php" />
    </div>
</template>
<script>
export default {
    data() {
        return {
            php : "php中文网"
        };
    },
    beforeUpdate() {
        console.log("5改变内容之前调用");
    },
    updated() {
        console.log("6改变内容之后调用");
    }
};
</script>
<template>
    <div>
        欧阳克
    </div>
</template>
<script>
export default {
    beforeUnmount() {
        console.log("9组件销毁之前调用");
    },
    unmounted() {
        console.log("10组件销毁之后调用");
    }
};
</script>
<template>
    <div>
        
        <one-com v-if="show"></one-com>
        <button @click="show = !show">销毁</button>
        
        <keep-alive>
            <one-com v-if="show"></one-com>
        </keep-alive>
    </div>
</template>
<script>
import OneCom from "./components/OneCom";
export default {
    components: {
        OneCom
    },
    data() {
        return {
            show: true
        }
    }
};
</script>
<template>
    <div>
        欧阳克
    </div>
</template>
<script>
export default {
    activated() {
        console.log("11组件缓存前调用");
    },
    deactivated() {
        console.log("12组件缓存后调用");
    }
};
</script>
| 生命周期 | 作用 | 
|---|
| beforeCreate | 在创建组件之前调用 | 
| created | 组件创建完成调用 | 
| beforeMount | 模版挂载之前调用 | 
| mounted | 模版挂载完成调用 | 
| beforeUpdate | 改变内容之前调用 | 
| update | 改变内容之后调用 | 
| beforeUnmount | 组件销毁之前调用 | 
| unmounted | 组件销毁之后调用 |