- 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>