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)
        });
    }
},