如何在不影响其他组件的情况下更改V-For内部一个组件的状态
我有一个childComponent
,该通过parentcomponent
的内部通过v-for
动态渲染。在父组件内部,我有一些逻辑,可以从数据库中获取数据并在屏幕上显示。获取请求查询是所选子组件的基础(单击)。用户单击一个组件后,我想向用户展示数据正在加载数据通过将子组件内的文本更改为loading
。我面临的问题是,在发送请求时,所有由v-for
将状态更改为“加载...”的子女组件。我只想单击一次更改的一次。
编辑:
”创建了我问题的简单表示。
parentcomponent.vue
<template>
<div>
<childComponent
v-for="(element, index) in 3"
:key="index"
:data="index"
:loading="loading"
@click-from-child="clickedEvent"
/>
<p>{{ returnedData }}</p>
</div>
</template>
<script>
import childComponent from "./childComponent";
export default {
components: { childComponent },
data() {
return {
loading: false,
returnedData: "",
};
},
methods: {
clickedEvent(componentData) {
this.loading = true;
this.returnedData = "";
console.log(`Request Sent to: ${componentData}`);
setTimeout(() => {
console.log("Request Completed - Success");
this.returnedData = `Some Data returned from: ${componentData}`;
this.loading = false;
}, 3000);
},
},
};
</script>
childcomponent.vue
<template>
<p v-if="loading">LOADING...</p>
<p v-else @click="triggerMethod">Click Me</p>
</template>
<script>
export default {
props: {
data: {
type: Number,
},
loading: {
type: Boolean,
default: false,
},
},
methods: {
triggerMethod() {
const customURL = `getDataURL/data=${this.data}`;
this.$emit("click-from-child", customURL);
},
},
};
</script>
I have a childComponent
which is rendered dynamically via v-for
inside of the parentComponent
. Inside the Parent component I have some logic that fetches data from the database and displays it on the screen. The fetch request query is bases on the child component selected (clicked on). Once the user has clicked on a component I would like to show the user that the data is loading by changing text inside the child component to loading
. The issue I'm facing is that when the request has been sent, all children components generated by v-for
change status to "Loading...". I would only like the once that has been clicked to change.
Edit: Added CodeSandbox
I created a simple representation of my problem.
parentComponent.vue
<template>
<div>
<childComponent
v-for="(element, index) in 3"
:key="index"
:data="index"
:loading="loading"
@click-from-child="clickedEvent"
/>
<p>{{ returnedData }}</p>
</div>
</template>
<script>
import childComponent from "./childComponent";
export default {
components: { childComponent },
data() {
return {
loading: false,
returnedData: "",
};
},
methods: {
clickedEvent(componentData) {
this.loading = true;
this.returnedData = "";
console.log(`Request Sent to: ${componentData}`);
setTimeout(() => {
console.log("Request Completed - Success");
this.returnedData = `Some Data returned from: ${componentData}`;
this.loading = false;
}, 3000);
},
},
};
</script>
childComponent.vue
<template>
<p v-if="loading">LOADING...</p>
<p v-else @click="triggerMethod">Click Me</p>
</template>
<script>
export default {
props: {
data: {
type: Number,
},
loading: {
type: Boolean,
default: false,
},
},
methods: {
triggerMethod() {
const customURL = `getDataURL/data=${this.data}`;
this.$emit("click-from-child", customURL);
},
},
};
</script>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试将索引作为
加载
prop而不是布尔值:try to pass index as
loading
prop instead of boolean: