Javascript 为什么我的vue组件不能重新渲染?
我有一个问题,为什么这个组件,在更改值后不重新渲染,所以我尝试做的是像amazon一样的动态过滤器,使用唯一的复选框,让我们看看 我有4个组件[App.vue、test-filter.vue、filterInputs.vue、checkboxs.vue] 这里是我的示例代码沙盒,请检查控制台,您将看到值发生变化 第一个组件是App.vueJavascript 为什么我的vue组件不能重新渲染?,javascript,vue.js,vuejs2,vue-component,Javascript,Vue.js,Vuejs2,Vue Component,我有一个问题,为什么这个组件,在更改值后不重新渲染,所以我尝试做的是像amazon一样的动态过滤器,使用唯一的复选框,让我们看看 我有4个组件[App.vue、test-filter.vue、filterInputs.vue、checkboxs.vue] 这里是我的示例代码沙盒,请检查控制台,您将看到值发生变化 第一个组件是App.vue <template> <div id="app"> <h1>Filter</h1&g
<template>
<div id="app">
<h1>Filter</h1>
{{ test }}
<test-filter :filters="filters" :value="test"></test-filter>
</div>
</template>
<script>
import testFilter from "./test-filter";
import filters from "./filters";
export default {
name: "App",
components: {
testFilter,
},
data() {
return {
filters: filters,
test: {},
};
},
};
</script>
滤器
{{test}}
从“/test filter”导入testFilter;
从“/filters”导入筛选器;
导出默认值{
名称:“应用程序”,
组成部分:{
测试过滤器,
},
数据(){
返回{
过滤器:过滤器,
测试:{},
};
},
};
因此,App.vue保存过滤器组件和我想要显示的测试值,过滤器数据是保存对象数组的虚拟数据。
在我的测试过滤器组件中,我循环抛出过滤器道具,过滤器输入组件输出我想要的输入(在本例中是复选框)
test-filter.vue
<template>
<div class="test-filter">
<div
class="test-filter__filter-holder"
v-for="filter in filters"
:key="filter.id"
>
<p class="test-filter__title">
{{ filter.title }}
</p>
<filter-inputs
:value="value"
:filterType="filter.filter_type"
:options="filter.options"
@checkboxChanged="checkboxChanged"
></filter-inputs>
</div>
</div>
<template>
<script>
import filterInputs from "./filterInputs";
export default {
name: "test-filter",
components: {
filterInputs,
},
props:{
filters: {
type: Array,
default: () => [],
},
value: {
type: Array,
default: () => ({}),
},
},
methods:{
checkboxChanged(value){
// Check if there is a array in checkbox key if not asssign an new array.
if (!this.value.checkbox) {
this.value.checkbox = [];
}
this.value.checkbox.push(value)
}
};
</script>
{{filter.title}
从“/filterInputs”导入filterInputs;
导出默认值{
名称:“测试过滤器”,
组成部分:{
过滤装置,
},
道具:{
过滤器:{
类型:数组,
默认值:()=>[],
},
价值:{
类型:数组,
默认值:()=>({}),
},
},
方法:{
复选框已更改(值){
//检查复选框键中是否有数组,如果没有,请指定新数组。
如果(!this.value.checkbox){
this.value.checkbox=[];
}
this.value.checkbox.push(值)
}
};
因此,我需要理解为什么更改props值也会更改为父组件,在本例中,App.vue和我尝试将值发送到App.vue,组件也没有重新渲染,但如果我检查vue dev工具,我会看到值已更改,但在{test}中的DOM中没有。
因此,我不会用更多的代码让您感到厌烦filterInputs.vue包含名为checkbox的子组件,从中,我将选中复选框的值从checkbox.vue发送到filterInputs.vue,再发送到test-filter.vue,并且每个组件都具有作为道具的值,如果您想查看其余组件,我很高兴能够如果你做了
过滤网
<template>
<div>
<check-box
v-if="filterType == checkboxName"
:options="options"
:value="value"
@checkboxChanged="checkboxChanged"
></check-box>
</div>
</template>
<script>
export default {
props: {
value: {
type: Object,
default: () => ({}),
},
options: {
type: Array,
default: () => [],
},
methods: {
checkboxChanged(value) {
this.$emit("checkboxChanged", value);
},
},
}
</script>
导出默认值{
道具:{
价值:{
类型:对象,
默认值:()=>({}),
},
选项:{
类型:数组,
默认值:()=>[],
},
方法:{
checkboxChanged(值){
这是$emit(“checkboxChanged”,值);
},
},
}
复选框.vue
<template>
<div>
<div
v-for="checkbox in options"
:key="checkbox.id"
>
<input
type="checkbox"
:id="`id_${_uid}${checkbox.id}`"
@change="checkboxChange"
:value="checkbox"
/>
<label
:for="`id_${_uid}${checkbox.id}`"
>
{{ checkbox.title }}
</label>
</div>
</div>
<template>
<script>
export default {
props: {
value: {
type: Object,
default: () => ({}),
},
options: {
type: Array,
default: () => [],
},
}
methods: {
checkboxChange(event) {
this.$emit("checkboxChanged", event.target.value);
},
},
};
</script>
{checkbox.title}}
导出默认值{
道具:{
价值:{
类型:对象,
默认值:()=>({}),
},
选项:{
类型:数组,
默认值:()=>[],
},
}
方法:{
checkboxChange(事件){
这个.emit(“checkboxChanged”,event.target.value);
},
},
};
我找到了解决方案,正如我在评论中所说的。问题是我没有在复选框输入中使用v-model。Vue是一个非常好的框架。问题并不深入,我在复选框输入中测试了v-model,我发现它在我选中任何复选框后重新渲染组件,因此我搜索了更多内容,并在其中找到了解释h我们可以在自定义组件中实现v-model,这就是我的问题的解决方案,如果您想查看,我也会更新我的
Big Thaks感谢所有支持我找到解决方案的人:sarkiroka,Jakub A Suplick使用反应属性:)您提供的代码存在一些问题。请尝试在适当的位置重新创建一个工作示例,以便我们详细查看。我制作了一个示例。请检查控制台:我发现了为什么出现这种奇怪行为的问题vior之所以发生,是因为我在复选框输入中没有使用“v-model”,我尝试在输入中使用v-model,结果成功了,组件重新渲染……但是有任何方法可以解决这个问题。