Vue学习之组件切换及父子组件小结(八)
程序员文章站
2023-01-01 13:27:31
一、组件切换: 1、v-if与v-else方式: 2、组件切换之component方式: 3、组件切换之动画效果: 二、父子组件: 1、子组件默认是无法访问父组件的; 2、父组件V-ON传递方法到子组件,子组件需要接收定义到props数组中,才能使用 3、子组件通过事件调用向父组件传值: 三、使用r ......
一、组件切换:
1、v-if与v-else方式:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> </head> <body> <div id="app"> <a href="" @click.prevent="flag=true">登录</a> <a href="" @click.prevent="flag=false">注册</a> <login v-if="flag"></login> <register v-else="flag"></register> </div> <script> vue.component("login", { template: "<h3>登录组件</h3>" }); vue.component("register", { template: "<h3>注册组件</h3>" }); var vm = new vue({ el: "#app", data: { flag: true }, methods: {}, filters: {}, directives: {} }); </script> </body> </html>
2、组件切换之component方式:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> </head> <body> <div id="app"> <!-- 1.v-if 和v-else方式 --> <!-- <a href="" @click.prevent="flag=true">登录</a> <a href="" @click.prevent="flag=false">注册</a> <login v-if="flag"></login> <register v-else="flag"></register> --> <!-- 2.vue 提供了 component ,来展示对应名称的组件 --> <!-- component 是一个占位符,:is 属性,可以用来指定要展示的组件的名称 --> <a href="" @click.prevent="comname='login'">登录</a> <a href="" @click.prevent="comname='register'">注册</a> <component :is="comname"></component> </div> <script> vue.component("login", { template: "<h3>登录组件</h3>" }); vue.component("register", { template: "<h3>注册组件</h3>" }); var vm = new vue({ el: "#app", data: { comname: "" }, methods: {}, filters: {}, directives: {} }); </script> </body> </html>
3、组件切换之动画效果:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> <style> .v-enter, .v-leave-to { opacity: 0; transform: translatex(150px); } .v-enter-active, .v-leave-active { transition: all 0.8s ease; } </style> </head> <body> <div id="app"> <a href="" @click.prevent="comname='login'">登录</a> <a href="" @click.prevent="comname='register'">注册</a> <!-- 通过 mode 属性,设置组件切换时候的模式 --> <transition mode="out-in"> <component :is="comname"></component> </transition> </div> <script> vue.component("login", { template: "<h3>登录组件</h3>" }); vue.component("register", { template: "<h3>注册组件</h3>" }); var vm = new vue({ el: "#app", data: { comname: "" }, methods: {}, filters: {}, directives: {} }); </script> </body> </html>
二、父子组件:
1、子组件默认是无法访问父组件的;
2、父组件v-on传递方法到子组件,子组件需要接收定义到props数组中,才能使用
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> <style></style> </head> <body> <div id="app"> <!-- 父组件,可以在引用子组件的时候,通过属性绑定(v-bind)的形式, 把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部, 供子组件使用 --> <com1 v-bind:parentmsg="msg"></com1> </div> <script> var vm = new vue({ el: "#app", data: { msg: "这是父组件中的数据" }, methods: {}, components: { // 子组件默认是无法访问到父组件中的data上的数据和methods中的方法 com1: { data() { // 子组件中的data数据,并不是通过父组件传递过来的,而是子组件啊自身私有的 // 比如:子组件通过ajax,请求回来的数据,都可以放到data身上; // data 上的数据,都是可读可写的 return { title: "123", content: "qqq" }; }, template: '<h1 @click="change">这是子组件----{{ parentmsg }}</h1>', // 组件中的所有 props 中的数据,都是通过父组件传递给子组件的 // props 中的数据,都是可读的,无法重新赋值 props: ["parentmsg"], // 把父组件传递过来的 parentmsg 属性,先在 props 数组中定义一下,这样,才能使用这个数据 directives: {}, filters: {}, methods: { change() { this.parentmsg = "被修改了"; } } } } }); </script> </body> </html>
3、子组件通过事件调用向父组件传值:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> <style></style> </head> <body> <div id="app"> <com2 @func123="show"></com2> </div> <template id="tmp1"> <div> <h1>这是子组件</h1> <input type="button" value="这是子组件中的按钮--点击它,触发:父组件传递过来的func 方法" @click="myclick" /> </div> </template> <script> // 定义一个字面量类型的 组件模板对象 var com2 = { // 通过指定一个id,表示说,要去加载这个指定id的 template 元素中的内容 // 当做组件的html结构 template: "#tmp1", data() { return { sonmsg: { name: "小头儿子", age: "6" } }; }, methods: { myclick() { // emit 触发、调用、发射 this.$emit("func123", this.sonmsg); } } }; var vm = new vue({ el: "#app", data: { datamsgformson: null }, methods: { show(data) { this.datamsgformson = data; console.log("调用了父组件身上的 show 方法:---" + data); } }, components: { com2 // com2:com2 } }); </script> </body> </html>
三、使用ref获取dom元素和组件引用:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>组件</title> <script src="./lib/vue.js"></script> <style></style> </head> <body> <div id="app"> <input type="button" value="获取元素" @click="getelement" ref="mybtn" /> <h3 id="myh3" ref="myh3">周末也在一直学习</h3> <hr /> <login ref="mylogin"></login> </div> <script> var login = { template: "<h1>登录组件</h1>", data() { return { msg: "son msg" }; }, methods: { show() { console.log("调用了子组件的方法"); } } }; var vm = new vue({ el: "#app", data: {}, methods: { getelement() { // console.log(document.getelementbyid("myh3").innertext); // ref --[reference] // console.log(this.$refs.myh3.innertext); // console.log(this.$refs.mylogin.msg); this.$refs.mylogin.show(); } }, components: { login } }); </script> </body> </html>
上一篇: Vue学习之过滤器和自定义指令小结(三)
下一篇: jQuery火箭图标返回顶部代码