如何在 VueJS 中将值从一个子组件传递到另一个子组件?
How to pass value from one child component to another in VueJS?
完整源代码:https://github.com/tenzan/menu-ui-tw
演示:https://flamboyant-euclid-6fcb57.netlify.com/
目标:
ItemsList
和 ItemImage
是 Menu.vue
的子组件。我需要将 image_url
从 ItemsList
传递到 ItemImage
,以便在左侧的项目按时间间隔自动更改后更改右侧的图像。
- 左侧:组件
ItemsList.vue
- 右侧:组件
ItemImage.vue
组件 Menu.vue 有 2 个子组件:
<template>
<div>
<!-- Two columns -->
<div class="flex mb-4">
<div class="w-1/2 bg-gray-400">
<ItemsList />
</div>
<div class="w-1/2 bg-gray-500">
<ItemImage></ItemImage>
</div>
</div>
</div>
</template>
<script>
import ItemsList from "./ItemsList";
import ItemImage from "./ItemImage";
export default {
components: {
ItemsList,
ItemImage
}
};
</script>
ItemsList.vue:
<template>
<div>
<div v-for="item in menuItems" :key="item.name">
<ul
class="flex justify-between bg-gray-200"
:class="item.highlight ? 'highlight' : ''"
>
<p class="px-4 py-2 m-2">
{{ item.name }}
</p>
<p class="px-4 py-2 m-2">
{{ item.price }}
</p>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {
menuItems: [
{
name: "Apple",
price: 20,
image_url: "../assets/images/apple.jpg"
},
{
name: "Orange",
price: 21,
image_url: "../assets/images/orange.jpg"
},
{
name: "Banana",
price: 22,
image_url: "../assets/images/banana.jpg"
},
{
name: "Grape",
price: 23,
image_url: "../assets/images/grape.jpg"
}
]
};
},
created() {
var self = this;
self.menuItems.map((x, i) => {
self.$set(self.menuItems[i], "highlight", false);
});
var init = 0;
setInterval(function() {
if (init === self.menuItems.length) {
init = 0;
}
self.menuItems[init].highlight = true;
if (init === 0) {
self.menuItems[self.menuItems.length - 1].highlight = false;
} else {
self.menuItems[init - 1].highlight = false;
}
init++;
}, 2000);
}
};
</script>
<style scoped>
.highlight {
background-color: gray;
}
</style>
ItemImage.vue - 几乎是空的
<template>
<div><p>Hello from ItemImage component</p></div>
</template>
<script>
export default {
props: ["image_url"]
};
</script>
ItemsList 遍历每个项目并突出显示它。
我需要组件 ItemImage 来显示 active/highlighted 项目的图像。
URL 对于图像是 item.image_url
.
您可以尝试使用 emitting an event 从子组件到父组件。
在你的子组件ItemsList.vue中,向父组件发出事件(高亮属性设置为true):
created() {
var self = this;
self.menuItems.map((x, i) => {
self.$set(self.menuItems[i], "highlight", false);
});
var init = 0;
setInterval(function() {
if (init === self.menuItems.length) {
init = 0;
}
self.menuItems[init].highlight = true;
//emit an event to trigger parent event
this.$emit('itemIsHighlighted', menuItems[init].image_url)
if (init === 0) {
self.menuItems[self.menuItems.length - 1].highlight = false;
} else {
self.menuItems[init - 1].highlight = false;
}
init++;
}, 2000);
}
然后在你的父组件中Menu.vue:
<ItemsList @itemIsHighlighted="onItemHighlighted"/>
<ItemImage :image_url="this.selectedItem" ></ItemImage>
...
export default {
data() {
return {
selectedItem: ''
}
},
methods: {
onItemHighlighted(value) {
console.log(value) // someValue
this.selectedItem = value
}
}
}
我无法测试它,但我希望它能有所帮助。
您也可以在此处查看 答案。
P.S。使用 Vuex 将使这项任务变得容易得多。
使用 image_url 在 ItemsList 组件中发出事件,并在 Menu 组件中将 image_url 作为道具传递给 ItemImage 组件。我在下面的 codesandbox 中做了这个检查。
完整源代码:https://github.com/tenzan/menu-ui-tw
演示:https://flamboyant-euclid-6fcb57.netlify.com/
目标:
ItemsList
和 ItemImage
是 Menu.vue
的子组件。我需要将 image_url
从 ItemsList
传递到 ItemImage
,以便在左侧的项目按时间间隔自动更改后更改右侧的图像。
- 左侧:组件
ItemsList.vue
- 右侧:组件
ItemImage.vue
组件 Menu.vue 有 2 个子组件:
<template>
<div>
<!-- Two columns -->
<div class="flex mb-4">
<div class="w-1/2 bg-gray-400">
<ItemsList />
</div>
<div class="w-1/2 bg-gray-500">
<ItemImage></ItemImage>
</div>
</div>
</div>
</template>
<script>
import ItemsList from "./ItemsList";
import ItemImage from "./ItemImage";
export default {
components: {
ItemsList,
ItemImage
}
};
</script>
ItemsList.vue:
<template>
<div>
<div v-for="item in menuItems" :key="item.name">
<ul
class="flex justify-between bg-gray-200"
:class="item.highlight ? 'highlight' : ''"
>
<p class="px-4 py-2 m-2">
{{ item.name }}
</p>
<p class="px-4 py-2 m-2">
{{ item.price }}
</p>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {
menuItems: [
{
name: "Apple",
price: 20,
image_url: "../assets/images/apple.jpg"
},
{
name: "Orange",
price: 21,
image_url: "../assets/images/orange.jpg"
},
{
name: "Banana",
price: 22,
image_url: "../assets/images/banana.jpg"
},
{
name: "Grape",
price: 23,
image_url: "../assets/images/grape.jpg"
}
]
};
},
created() {
var self = this;
self.menuItems.map((x, i) => {
self.$set(self.menuItems[i], "highlight", false);
});
var init = 0;
setInterval(function() {
if (init === self.menuItems.length) {
init = 0;
}
self.menuItems[init].highlight = true;
if (init === 0) {
self.menuItems[self.menuItems.length - 1].highlight = false;
} else {
self.menuItems[init - 1].highlight = false;
}
init++;
}, 2000);
}
};
</script>
<style scoped>
.highlight {
background-color: gray;
}
</style>
ItemImage.vue - 几乎是空的
<template>
<div><p>Hello from ItemImage component</p></div>
</template>
<script>
export default {
props: ["image_url"]
};
</script>
ItemsList 遍历每个项目并突出显示它。
我需要组件 ItemImage 来显示 active/highlighted 项目的图像。
URL 对于图像是 item.image_url
.
您可以尝试使用 emitting an event 从子组件到父组件。
在你的子组件ItemsList.vue中,向父组件发出事件(高亮属性设置为true):
created() {
var self = this;
self.menuItems.map((x, i) => {
self.$set(self.menuItems[i], "highlight", false);
});
var init = 0;
setInterval(function() {
if (init === self.menuItems.length) {
init = 0;
}
self.menuItems[init].highlight = true;
//emit an event to trigger parent event
this.$emit('itemIsHighlighted', menuItems[init].image_url)
if (init === 0) {
self.menuItems[self.menuItems.length - 1].highlight = false;
} else {
self.menuItems[init - 1].highlight = false;
}
init++;
}, 2000);
}
然后在你的父组件中Menu.vue:
<ItemsList @itemIsHighlighted="onItemHighlighted"/>
<ItemImage :image_url="this.selectedItem" ></ItemImage>
...
export default {
data() {
return {
selectedItem: ''
}
},
methods: {
onItemHighlighted(value) {
console.log(value) // someValue
this.selectedItem = value
}
}
}
我无法测试它,但我希望它能有所帮助。
您也可以在此处查看
P.S。使用 Vuex 将使这项任务变得容易得多。
使用 image_url 在 ItemsList 组件中发出事件,并在 Menu 组件中将 image_url 作为道具传递给 ItemImage 组件。我在下面的 codesandbox 中做了这个检查。