vue.js 如何制作一个显示“重新渲染时属性被覆盖”反模式的示例

ntjbwcob  于 2022-12-04  发布在  Vue.js
关注(0)|答案(1)|浏览(97)

我希望确信“Props are overwritten when re-rendering”是一个anti pattern

const MyButton = Vue.extend({
  props: {
    obj: {}
  },
  template:
    "<button @click=\"obj.text = 'Value'+Math.round(Math.random()*100)\">Change text in child ({{obj.text}})</button>"
});

const app = new Vue({
  el: "#main",
  data: {
    obj: { text: "Value2" }
  },
  components: {
    MyButton
  },
  template: `
<div>
  <Button @click='obj.text = "Value"+Math.round(Math.random()*100)'>Change text in parent ({{obj.text}})</Button><br>
  <MyButton :obj='obj'/> 👈 Pressing here 'mutate' the prop. It is an anti-pattern (Props are overwritten when re-rendering). But it seems to work just fine, how to change this sample so it shows the anti-pattern problem? (https://eslint.vuejs.org/rules/no-mutating-props.html)
</div>`
});

密码:https://codepen.io/SVSMITH/pen/LYrXRzW
有人能帮忙吗?

k4emjkb1

k4emjkb11#

在你的例子中,你实际上并没有改变prop,因为你发送给child的是一个对象的引用。这个引用保持不变。看看如果你把child中的模板代码改为:

"<button @click=\"obj = {}\">Change text in child ({{obj.text}})</button>"

然后你会看到prop被覆盖了,子节点的值和父节点的值不一样,当父节点更新值的时候,子节点更新后的值会被覆盖,这会导致很严重很难发现的bug,所以在子节点使用emit来更新父节点的值,这样会通过prop更新子节点的值。
如果你有很多这样的道具和发射,你应该考虑使用像Pinia这样的商店。

相关问题