Vue 组件 - 如何避免改变道具(Laravel 组件)
Vue component - how to avoid mutating a prop (Laravel component)
我的 Laravel 的 Vue 组件收到以下警告:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever
the parent component re-renders. Instead, use a data or computed property based on the
prop's value. Prop being mutated: "benutzers"
found in
---> <BootstrapVueBTable1> at resources/js/components/b-table1.vue
<Root>
我尝试了一些重命名的变体,但我没有经验。
<template>
<div> <b-table striped hover :items="benutzers" > </b-table>
</div>
</template>
<script>
export default {
mounted() {
this.loadData();
},
methods: {
loadData:function() {
axios.get('/api/benutzers').then(res => {
if(res.status == 200) {
this.benutzers = res.data;
}
}).catch(err => {
console.log(err)
});
}
},
props: ['benutzers'],
}
</script>
好吧,这告诉你应该避免使用 benutzers
作为 prop 传递,因为它的值在调用你的组件时可能会被覆盖。此外,您正在自己的方法 loadData
.
中覆盖该值
避免此值出现问题的最佳方法是将其存储在组件的存储中或使用 computed property.
尝试使用 data
代替:
export default {
mounted(){
this.loadData();
},
data: {
benutzers: [],
},
methods: {
loadData: function() {
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers = res.data;
//i'm not sure if it's this.benutzers or just benutzers, but this should solve your problem
}
}).catch( err => {
console.log(err)
});
}
},
}
查看 Vue 的文档以了解 how to use data
in loops。
根据您需要的行为,可能有更好的方法来执行此操作,但您可以通过在 data
中创建一个新字段来监视 prop
的突变来避免改变 prop。这将允许父组件和子组件改变子组件中的值。
props: ['parentBenutzers'],
data() {
return {
benutzers: this.parentBenutzers,
}
},
watch: {
parentBenutzers: function(val) {
this.benutzers = val;
}
},
mounted(){
this.loadData();
},
methods:{
loadData:function(){
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers=res.data;
}
}).catch(err=>{
console.log(err)
});
}
},
哦,只是第二个答案...谢谢,我也用亲子的东西测试过这个,请等一下,好的,也可以。即使我还不明白其中的区别
两个答案都有效...下面是正确的代码。之前尝试过很多东西,还有数据方面的东西。但是当我尝试这样做时,我在模板部分出现了错误......有时你在迷宫中如此之深,你看不到墙......无论如何非常感谢你的帮助回答Laryssa和贾里德
<template>
<div> <b-table striped hover :items="benutzers" > </b-table>
</div>
</template>
<script>
export default {
mounted(){
this.loadData();
},
data() {
return{
benutzers: [],
}
},
methods: {
loadData: function() {
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers = res.data;
//i'm not sure if it's this.benutzers or just benutzers, but this should solve your problem
}
}).catch( err => {
console.log(err)
});
}
},
}
</script>
在某些情况下,如果你使用
,你仍然会覆盖你的道具
<div v-for="benutzer in parentbenutzers">
因此您需要将 v-for 更改为此
<div v-for="benutzer in benutzers">
props: ['parentBenutzers'],
data() {
return {
benutzers: this.parentBenutzers,
}
},
mounted(){
this.loadData();
},
methods:{
loadData:function(){
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers=res.data;
}
}).catch(err=>{
console.log(err)
});
}
},
我的 Laravel 的 Vue 组件收到以下警告:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever
the parent component re-renders. Instead, use a data or computed property based on the
prop's value. Prop being mutated: "benutzers"
found in
---> <BootstrapVueBTable1> at resources/js/components/b-table1.vue
<Root>
我尝试了一些重命名的变体,但我没有经验。
<template>
<div> <b-table striped hover :items="benutzers" > </b-table>
</div>
</template>
<script>
export default {
mounted() {
this.loadData();
},
methods: {
loadData:function() {
axios.get('/api/benutzers').then(res => {
if(res.status == 200) {
this.benutzers = res.data;
}
}).catch(err => {
console.log(err)
});
}
},
props: ['benutzers'],
}
</script>
好吧,这告诉你应该避免使用 benutzers
作为 prop 传递,因为它的值在调用你的组件时可能会被覆盖。此外,您正在自己的方法 loadData
.
避免此值出现问题的最佳方法是将其存储在组件的存储中或使用 computed property.
尝试使用 data
代替:
export default {
mounted(){
this.loadData();
},
data: {
benutzers: [],
},
methods: {
loadData: function() {
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers = res.data;
//i'm not sure if it's this.benutzers or just benutzers, but this should solve your problem
}
}).catch( err => {
console.log(err)
});
}
},
}
查看 Vue 的文档以了解 how to use data
in loops。
根据您需要的行为,可能有更好的方法来执行此操作,但您可以通过在 data
中创建一个新字段来监视 prop
的突变来避免改变 prop。这将允许父组件和子组件改变子组件中的值。
props: ['parentBenutzers'],
data() {
return {
benutzers: this.parentBenutzers,
}
},
watch: {
parentBenutzers: function(val) {
this.benutzers = val;
}
},
mounted(){
this.loadData();
},
methods:{
loadData:function(){
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers=res.data;
}
}).catch(err=>{
console.log(err)
});
}
},
哦,只是第二个答案...谢谢,我也用亲子的东西测试过这个,请等一下,好的,也可以。即使我还不明白其中的区别
两个答案都有效...下面是正确的代码。之前尝试过很多东西,还有数据方面的东西。但是当我尝试这样做时,我在模板部分出现了错误......有时你在迷宫中如此之深,你看不到墙......无论如何非常感谢你的帮助回答Laryssa和贾里德
<template>
<div> <b-table striped hover :items="benutzers" > </b-table>
</div>
</template>
<script>
export default {
mounted(){
this.loadData();
},
data() {
return{
benutzers: [],
}
},
methods: {
loadData: function() {
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers = res.data;
//i'm not sure if it's this.benutzers or just benutzers, but this should solve your problem
}
}).catch( err => {
console.log(err)
});
}
},
}
</script>
在某些情况下,如果你使用
,你仍然会覆盖你的道具<div v-for="benutzer in parentbenutzers">
因此您需要将 v-for 更改为此
<div v-for="benutzer in benutzers">
props: ['parentBenutzers'],
data() {
return {
benutzers: this.parentBenutzers,
}
},
mounted(){
this.loadData();
},
methods:{
loadData:function(){
axios.get('/api/benutzers').then(res=>{
if(res.status==200){
this.benutzers=res.data;
}
}).catch(err=>{
console.log(err)
});
}
},