1.小球动画flag标识符的作用分析
<style>
.ball{
width:15px;
height:15px;
background-color:red;
border-radius:50%;
}
</style>
<div>
<input type="button" value="加入购物车" @click="flag=!flag">
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
>
<div class="ball" v-show="flag"></div>
</transition>
</div>
var vm = new Vue({
el:'#app',
data:{
flag:false;
},
methods:{
beforeEnter(el){
el.style.transform = 'translate(0,0)'
},
enter(el,done){
el.offsetWidth
el.style.transform = 'translate(150px,450px)'
el.style.transition='all 1s ease'
done()
},
afterEnter(el){
//这句话第一个功能是,是控制小球的显示和隐藏,第二个功能是直接跳过后半场动画,让flag标识符直接变为false,当第二次再点击按钮的时候,flag false -> true
this.flag=!this.flag
//Vue把一个完整的动画,使用钩子函数拆分为了两部分;我们使用flag标识符,来表示动画切换
//刚开始,flag = false -> true -> false
}
}
})
2.父组件向子组件传值和data与props的区别
<div id="app">
//父组件,可以在引用子组件的时候,通过属性绑定(v-bind:)的形式,把需要传递给子组件的数据,以数据绑定的形式,传递到子组件的内部,供子组件使用
<com1 v-bind:parentmsg="msg"></com1>
</div>
var vm = new Vue({
el:'#app',
data:{
msg:'123 啊-父组件中的数据'
},
methods:{}
components:{
//结论:子组件中,默认无法访问到父组件中的data上的数据和methods中的方法
com1:{
data(){
//注意:子组件中的data数据,并不是通过父组件传递过来的,而是子组件自身私有的,比如:子组件通过Ajax,请求回来的数据,都可以放到data身上;
//data上的数据,都是可读可写的
return{
tittle:'123'
content:'qqq'
}
}
//template:'<h1>这是子组件---{{msg}}</h1>'//直接访问父组件中的msg访问不到
//组件中的所有props中的数据,都是父组件传递给子组件的
//props中的数据,都是只读的,无法重新赋值
props:['parentmsg'],//把父组件传递过来的parentsmsg属性,先在props数组中,定义一下,这样,才能使用这个数据
template:'<h1>这是子组件---{{parentsmsg}}</h1>'
}
}
})
3.子组件通过事件调用向父组件传值
<div id="app">
//父组件向子组件传递方法,使用的是事件绑定机制v-on,当我们自定义了一个事件属性之后,那么子组件就能够,通过某些方式,来调用传递进去的这个方法了
<com2 v-on:func='show'>
</com2>
</div>
<template id="tmp1">
<div>
<h1>这是子组件</h1>
<input type="button" value="这是子组件中的按钮 - 点击它,触发父组件传递过来的func方法" @click="myclick">
</div>
</template>
//定义了一个字面量类型的组件模板对象
var com2 = {
template:"#tmp1",//通过制定一个Id,表示说,要去加载这个指定的Id的template元素中的内容,当做组件的HTML结构
data(){
return{
sonmsg:{name:'小头儿子',age:'6'}
}
}
methods:{
myclick(){
//当点击子组件的按钮的时候,如何拿到父组件传递过来的func方法,并调用这个方法?
//emit英文原意是触发调用的意思
this.$emit('func',this.sonmsg)
console.log('ok')
}
}
}
var vm = new Vue({
el:'#app',
data:{
datamsgFormSon:null
},
methods:{
show(data){
this.datamsgFormSon = data
}
},
components:{
com2
}
})
4.组件案例评论列表
<div id="app">
<cmt-box @func="loadComments"></cmt-box>
<ul class='list-group'>
<li class='list-group-item' v-for="item in list" :key="item.id">
<span class='badge'>评论人:{{item.user}}</span>
{{item.content}}
</li>
</ul>
</div>
<template id="tmp1">
<div>
<div class="form-group">
<label>评论人:</label>
<input type="text" class="form-control" v-model="user">
<div>
<div class="form-group">
<label>评论内容:</label>
<textarea class="form-control" v-model="content"></texxtarea>
<div>
<div class="form-group">
<input type="button" value="发表评论" class="btn btn-primary" @click="postConment">
<div>
</div>
</template>
var commenBox = {
data(){
return{
user:' '
content:' '
}
}
template:"#tmp1"
methods:{
postComment(){
//发表评论的方法
//发表评论的业务逻辑
(1)评论数据存到localStorage
(2)先组织出一个最新的评论数据对象
(3)想办法把第二步中,得到的评论对象,保存到localStorage中:
(3.1)localStorage只支持存放字符串数据,要先调用JSON.stringify
(3.2)在保存最新的评论数据之前,要先从localStorage获取到之前的评论数据(string),转换为一个数组对象,然后把最新的评论,push到这个数组
(3.3)如果获取到的localStorage中的评论字符串,为空不存在,则可以返回一个'[]'让JSON.parse去转换
(3.4)把最新的评论列表数组,再次调用JSON.stringify转为数组字符串,然后调用localStorage.setItem()
var comment = {id:Date.now(),user:this.user,conent:this.conent}
//从localStorage中获取所有的评论
var list = JSON.parse(localStorage.getItem('cmts')||'[]')
//unshift在前面添加
list.unshift(comment)
//重新保存最新的评论数据
localStorage.setItem('cmt',JSON.stringify(list))
this.user = this.content='';
this.$emit('func')
}
}
}
var vm = new Vue({
el:'#app',
data:{
list:[
{id:Date.now(),user:'李白',content:'天生我材必有用'},
{id:Date.now(),user:'江小白',content:'劝君更尽一杯酒'},
{id:Date.now(),user:'小马',content:'风吹草底现牛羊'},
]
},
beforeCreate(){
//注意:这里不能调用localComments方法,因为在执行这个钩子函数的时候,data和methods都还没有被初始化
}
created(){
this.loadComments();
}
methods:{
loadComments(){//刷新页面一开始从本地的localStorage,加载评论列表
var list = JSON.parse(localStorage.getItem('cmts')||'[]')
this.list = list;
}
},
components:{
'cmt-box':commentBox
}
})
5.使用ref获取DOM元素和组件引用
<div id="app">
<input type="button" value="获取元素" @click="getElement">
<h3 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(){
//ref是英文单词【reference】引用的意思
console.log(this.$refs.myh3.innewText)
console.log(this.$refs.mylogin.msg)
this.$refs.mylogin.show();
},
},
components:{
login
}
})
</script>
网友评论