Vue学习实践笔记(四)

  • Demo1——父组件向子组件传递数据和方法
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
</head>
<body>
	<div id="app">
	<!-- 父组件在引用子组件的时候,通过属性绑定的形式把需要传递给子组件的数据传递到子组件内部 -->
		<com1 :parentmsg="msg">
		</com1>
	</div>
	<template id="tmpl">
		<div>
			<p>子组件----{{ parentmsg }}</p>
		</div>
	</template>
	<script type="text/javascript" charset="UTF-8">
		var vm = new Vue({
			el: '#app',
			data: {
				msg: '父组件的数据'
			},
			components: {
				// 子组件默认无法访问到父组件中的data数据和methods方法
				com1: {
					template: '#tmpl',
					props: ['parentmsg'] // 父组件传过来的parentmsg属性,要先在props数组中定义一下
				}
			}
		})
	</script>
</body>
</html>
  • Demo2:发表评论——组件传值、传方法和本地缓存localStorage的用法
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
</head>
<body>
	<div id="app">
		<com1 @func="loadComments"></com1>
		<ul>
			<li v-for="item in list" :key="item.id">
				<span>评论人:{{ item.user }}</span>
				{{ item.content }}
			</li>
		</ul>
	</div>
	<template id="tmpl">
		<div>
			<div>
				<label>评论人:</label>
				<input type="text" v-model="user">
			</div>
			<div>
				<label>评论内容:</label>
				<textarea v-model="content"></textarea>
			</div>
			<div><button @click="postComment">发表评论</button></div>
		</div>
	</template>
	<script type="text/javascript" charset="UTF-8">
		var vm = new Vue({
			el: '#app',
			data: {
				list: [
					{ id: Date.now(), user: '李白', content: '天生我才必有用' },
					{ id: Date.now(), user: '江小白', content: '劝君更尽一杯酒' },
					{ id: Date.now(), user: '小马', content: '嘶嘶嘶' }
				]
			},
			methods: {
				loadComments() { // 从本地的localStorage中加载评论列表
					var list = JSON.parse(localStorage.getItem('cmts') || '[]')
					this.list = list
				}
			},
			components: {
				'com1': {
					template: '#tmpl'
					, data: function(){
						return { 
							user: '',
							content: ''
						}
					}
					, methods: { 
						postComment() {
							var comment = { id: Date.now(), user: this.user, content: this.content }
							// 从localStorage中获取所有的评论
							var list = JSON.parse(localStorage.getItem('cmts') || '[]')
							list.unshift(comment)
							// 重新保存最新的评论数据
							localStorage.setItem('cmts', JSON.stringify(list))
							this.user = this.content = ''
							this.$emit('func')
						}
					}
				}
			},
			created() {
				this.loadComments()
			}
		})
	</script>
</body>
</html>
  • Demo3——使用ref获取DOM元素和组件引用
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
</head>
<body>
	<div id="app">
		<p ref="myp">使用ref获取DOM元素</p>
		<button @click="getElement">调用组件方法</button>
		<com1 ref="mycom1"></com1>
	</div>
	<template id="tmpl">
		<div>
			<p>使用ref获取DOM组件</p>
		</div>
	</template>
	<script type="text/javascript" charset="UTF-8">
		var vm = new Vue({
			el: '#app',
			methods: {
				getElement() {
					this.$refs.mycom1.show()
				}
			},
			components: {
				'com1': {
					template: '#tmpl'
					, data: function(){
						return { 
							msg: '子组件'
						}
					}
					, methods: { 
						show() {
							console.log('调用了子组件的方法')
						}
					}
				}
			}
		})
	</script>
</body>
</html>
  • Demo4:路由——路由对象的定义和用法、router-view标签和router-link标签的用法、redirect重定向的使用、设置选中路由高亮、切换动画
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
	<script type="text/javascript" src="js/vue-router.js" charset="UTF-8"></script>
	<style>
	.router-link-active, .myactive{
		color: #f00;
		font-weight: 800;
		font-style: italic;
		font-size: 80px;
		text-decoration: underline;
		background-color: #0f0;
	}
	.v-enter, .v-leave-to{
		opacity: 0;
		transform: translateX(140px);
	}
	.v-enter-active, .v-leave-active{
		transition: all 0.5s ease;
	}
	</style>
</head>
<body>
	<div id="app">
		<!-- router-link默认渲染为a标签 -->
		<router-link to="/login">登录</router-link>
		<router-link to="/register">注册</router-link>
		<!-- a标签不会应用路由样式,所以推荐用router-link代替a -->
		<a href="/#/login">登录</a>
		<a href="/#/register">注册</a>
		<!-- 路由规则匹配到的组件会展示到router-view中去 -->
		<transition>
			<router-view></router-view>
		</transition>
	</div>
	<script type="text/javascript" charset="UTF-8">
	var login = {
		template: '<P>登录</P>'
	}
	var register = {
		template: '<P>注册</P>'
	}
	// 可以将配置对象作为参数传递给vue路由对象的构造函数
	var routerObj = new VueRouter({
		// routes: {}  //  表示一条路由匹配规则
		routes: [ 
			// 表示一组路由匹配规则,每条规则都是一个对象,包含两个必须的属性
			// path属性表示所监听的路由链接地址
			// component属性表示如果路由是前面匹配到的path,则展示component属性对应的那个组件
			// component的值必须是组件的模板对象,不能是组件的引用名称
			// redirect属性表示监听到path时重定向到指定的url,值是字符串类型
			{ path: '/', redirect: '/login' },
			{ path: '/login', component: login },
			{ path: '/register', component: register }
		],
		linkActiveClass: 'myactive'
	})
		var vm = new Vue({
			el: '#app',
			router: routerObj // 将路由规则对象,注册到vm实例上,用来监听URL地址的变化,然后展示对应的组件
		})
	</script>
</body>
</html>
  • Demo5:路由——两种传参方式
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
	<script type="text/javascript" src="js/vue-router.js" charset="UTF-8"></script>
</head>
<body>
	<div id="app">
		<router-link to="/login?id=10&name=zs">登录</router-link>
		<router-link to="/register/12/zx">注册</router-link>
		<router-view></router-view>
	</div>
	<script type="text/javascript" charset="UTF-8">
		var login = {
			template: '<P>第一种传参方式 --- {{ $route.query.id }} --- {{ $route.query.name }}</P>',
			data() {
				return {
					msg: '123'
				}
			}
		}
		var register = {
			template: '<P>第二种传参方式 --- {{ $route.params.id }} --- {{ $route.params.name }}</P>'
		}
		var routerObj = new VueRouter({
			routes: [ 
			{ path: '/', redirect: '/login' },
			{ path: '/login', component: login },
			{ path: '/register/:id/:name', component: register }
			]
		})
		var vm = new Vue({
			el: '#app',
			router: routerObj
		})
	</script>
</body>
</html>
  • Demo6:路由——路由的嵌套
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
	<script type="text/javascript" src="js/vue-router.js" charset="UTF-8"></script>
</head>
<body>
	<div id="app">
		<router-link tag="button" to="/account">外层组件按钮 </router-link>
		<router-view></router-view>
	</div>
	<template id="tmpl">
		<div>
			<P>外层组件内容</P>
			<router-link tag="button" to="/account/login">内层组件按钮</router-link>
			<router-view></router-view>
		</div>
	</template>
	<script type="text/javascript" charset="UTF-8">
		var account = {
			template: '#tmpl'
		}
		var login = {
			template: '<p>内层组件内容</p>'
		}
		var router = new VueRouter({
			routes: [{ 
				path: '/account',
				component: account,
				// 子路由的path前面不要带/
				children: [{ path: 'login', component: login }]
			}]
		})
		var vm = new Vue({
			el: '#app',
			// 下面是router: router的简写
			router
		})
	</script>
</body>
</html>
  • Demo7——命名视图实现经典布局
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
	<script type="text/javascript" src="js/vue-router.js" charset="UTF-8"></script>
	<style>
		*{
			margin: 0;
			padding: 0;
		}
		.header {
			background-color: orange;
			height: 80px;
		}
		.container {
			display: flex;
			height: 400px;
		}
		.left {
			background-color: lightgreen;
			width: px;
			flex: 2;
		}
		.main {
			background-color: lightpink;
			width: px;
			flex: 8;
		}
	</style>
</head>
<body>
	<div id="app">
		<router-view></router-view>
		<div class="container">
			<router-view name="left"></router-view>
			<router-view name="main"></router-view>
		</div>
	</div>
	<script type="text/javascript" charset="UTF-8">
		var header = {
			template: '<p class="header">顶部</p>'
		}
		var leftBox = {
			template: '<p class="left">侧边栏</p>'
		}
		var mainBox = {
			template: '<p class="main">主体区</p>'
		}
		var router = new VueRouter({
			routes: [
				{ 
					path: '/', components: {
						default: header,
						left: leftBox,
						main: mainBox
					}
				}
			]
		})
		var vm = new Vue({
			el: '#app',
			router
		})
	</script>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值