vue中组件互相传值的方法
- 父组件给子组件传值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue-组件之间的传递信息</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="box">
<!-- 传布尔值的时候需要在前面加一个: -->
<mychild title="首页" :msg='msg' :myshow=true title='首页'></mychild>
<mychild title="购物车" :msg='msg' :myshow=true title='返回'></mychild>
<mychild title="返回" :msg='msg' :myshow=false title='购物车'></mychild>
</div>
<script type="text/javascript">
// 创建全局组件
Vue.component("mychild", {
template: "<div v-if='myshow'>导航-{{title}}-{{msg}}</div>",
// props:['title','myshow'] // 直接接收父组件传过来的数据
// 给父组件传过来的值设置一个类型 ,如果传过来的不是类型,会抛出一个异常
// props: {
// title: String,
// myshow: Boolean
// }
// 给组件设置默认值
props: {
title: {
type: String,
default: ''
},
myshow: {
type: Boolean,
default: true
},
msg: {
type: String,
default: ''
}
}
})
let vue = new Vue({
el: "#box",
data: {
'msg': '动态的传值'
}
})
</script>
</body>
</html>
- 子组件给父组件传值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>子组件给父组件传递信息</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="box">
<child @myevent="fatherClick"></child>
</div>
<script type="text/javascript">
Vue.component("child",{
data () {
return {
money: 100000
}
},
template: `
<div style="background-color:white">
<button @click="handlerClick">点我给父组件传值</button>
</div>
`,
methods:{
handlerClick () {
let _this = this;
_this.$emit('myevent',_this.money)
}
}
})
</script>
<script type="text/javascript">
let mv = new Vue({
el: "#box",
methods:{
fatherClick (data) {
console.log('哈哈',data)
}
}
})
</script>
</body>
</html>
- 使用refs方法进行传值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue-refs</title>
<script type="text/javascript" src="../js/vue.js"> </script>
</head>
<body>
<div id="box">
<!-- 如果把ref放在了标签上面,拿到的就是原生DOM -->
<!-- 如果把ref放在了组件上面,拿到的就是组件对象 -->
<input type="text" ref="myinpupt">
<button type="button" @click="handlerClick">add</button>
<child ref='mychild'></child>
</div>
<script type="text/javascript">
Vue.component('child',{
template: `
<div style="background-color:red">
</div>
`,
methods:{},
data () {
return {
childname: '1111111111111111111111'
}
}
})
</script>
<script type="text/javascript">
let mv = new Vue({
el: '#box',
methods:{
handlerClick () {
console.log(this.$refs)
// 通过refs的值进行修改
this.$refs.mychild.childname = '22222222222222222222'
}
}
})
</script>
</body>
</html>
```
- 兄弟组件在进行传值的时候,不能相互传值的,需要找到一个中间人
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>订阅分发模式</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="box">
<child1></child1>
<child2></child2>
</div>
<script type="text/javascript">
let bus = new Vue; // 当我们想使用订阅发布模式的时候,需要先创建一个vue的实例
Vue.component('child1',{
template: `<div><button @click='handlerClick'>点我给兄弟组件传值</button></div>`,
data () {
return {}
},
methods:{
handlerClick(){
bus.$emit('dingyue','这里是给订阅者的值')
}
},
mounted () {
// vue的生命周期,表示当vue的这个组件加载完毕后会自动执行这个方法
}
})
Vue.component('child2',{
template: `<div>{{data}}</div>`,
data () {
return {
data: ''
}
},
methods:{},
mounted () {
// vue的生命周期,表示当vue的这个组件加载完毕后会自动执行这个方法
bus.$on('dingyue', res => {
this.data = res;
console.log('aaaaaaa',res)
})
}
})
</script>
<script type="text/javascript">
let mv = new Vue({
el: "#box"
})
</script>
</body>
</html>
- 使用v-model传值
1.父传子 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用v-model传值</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="box">
<!-- v-model相当于 <input type="text" : ="myinput" @input="">-->
<input type="text" v-model="myinput1">
<child v-model="myinput1"></child>
</div>
<script type="text/javascript">
Vue.component('child', {
template: `<div class="box">
<label>{{value}}</label>
<input type="text" v-model="myinput" @input="handlerInput">
<button>点我一下试试</button>
</div>`,
methods: {
handlerInput () {
this.$emit("input",this.myinput)
}
},
props: ['value'],
data() {
return {
myinput: '',
}
},
})
</script>
<script type="text/javascript">
let vue = new Vue({
el: "#box",
data: {
myinput1: "default"
},
methods: {
}
})
</script>
</body>
</html>
- 子传父
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用v-model子传父</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="box">
<!-- v-model相当于 <input type="text" : ="myinput" @input="">-->
<input type="text" v-model="myinput1">
<child v-model="myinput1"></child>
<button @click="heandliClick">提交</button>
</div>
<script type="text/javascript">
Vue.component('child', {
template: `<div class="box">
<label>{{value}}</label>
<input type="text" v-model="myinput" @input="handlerInput">
</div>`,
methods: {
handlerInput() {
this.$emit("input", this.myinput)
}
},
props: ['value'],
data() {
return {
myinput: '',
}
},
})
</script>
<script type="text/javascript">
let vue = new Vue({
el: "#box",
data: {
myinput1: "default"
},
methods: {
heandliClick() {
console.log(this.myinput1)
}
}
})
</script>
</body>
</html>