美文网首页
vue学习(11):父子组件

vue学习(11):父子组件

作者: 不会改变 | 来源:发表于2020-01-07 18:51 被阅读0次

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>

相关文章

网友评论

      本文标题:vue学习(11):父子组件

      本文链接:https://www.haomeiwen.com/subject/vkpractx.html