子组件中修改props的正确方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子组件中修改props的正确方式相关的知识,希望对你有一定的参考价值。
参考技术A 首先我们创建子父组件父组件传值msgVal给子组件
2.在子组件中:(我们尝试用changeProps直接改变msgVal值)
控制台报错
简单来说就是 他希望避免直接改变该属性 最好用计算属性值或者基于属性值的数据来去修改他
所以~我们可以这样:
plan1:``` data中声明mag1 在 mounted函数中初始化赋值 后续操作直接用mag1来代替
PlanB:用计算属性来获取值 msg2即为props传参数的值 后续直接用它~
Vue.js - 如何将 prop 作为 json 数组传递并在子组件中正确使用?
【中文标题】Vue.js - 如何将 prop 作为 json 数组传递并在子组件中正确使用?【英文标题】:Vue.js - How to pass prop as a json array and use it correctly in child component? 【发布时间】:2020-08-11 05:21:41 【问题描述】:正在使用 Laravel 和 Vue。数据正在从 Laravel 返回到 Vue。发送给 Vue 子组件的 Vue 道具是一个 json 对象数组,但是子组件在读取它时会出错。控制台中的错误是:
“类型错误:无法读取未定义的属性 'id'”。任何帮助将不胜感激。
这是从 Laravel 返回的原始数据是:
"channels":["id":4,"name":"AI","created_at":"2020-04-27T15:18:01.000000Z","updated_at":"2020-04-27T15:18:01.000000Z","id":2,"name":"Android Development","created_at":"2020-04-27T15:18:01.000000Z","updated_at":"2020-04-27T15:18:01.000000Z","id":3,"name":"iOS Development","created_at":"2020-04-27T15:18:01.000000Z","updated_at":"2020-04-27T15:18:01.000000Z","id":1,"name":"Web Development","created_at":"2020-04-27T15:18:01.000000Z","updated_at":"2020-04-27T15:18:01.000000Z"]
作为 Vue prop 传递给子组件的数据:
<template>
<div id="component">
<router-link :to=" name: 'home' ">Home</router-link>
<router-view></router-view>
<br>
<vue-chat :channels="channels"></vue-chat>
</div>
</template>
<script>
export default
data()
return
channels: [],
,
methods:
fetchChannels()
let endpoint = `/channels`;
axios.get(endpoint).then(resp =>
this.channels = resp.data.channels;
);
,
,
created()
this.fetchChannels();
</script>
尝试访问 Vue 属性时出错的子组件:
<template>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<!-- <div class="card-header">Chat</div> -->
<div class="card-body">
<div class="container">
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default
props: ['channels'],
data()
return
activeChannel: this.channels[0].id,
,
</script>
<style scoped>
@import '/sass/app.scss';
</style>
【问题讨论】:
您在尝试访问 Vue 属性时收到了哪些错误消息? [Vue 警告]:数据()中的错误:“TypeError:无法读取未定义的属性 'id'” 好的,但是当你可以在子模板中直接使用channels
属性时,为什么还要在数据函数中使用activeChannel
?
【参考方案1】:
第一次channels
不可用会引发该错误,我建议将activeChannel
定义为计算属性,如:
export default
props: ['channels'],
data()
return
,
computed:
activeChannel()
return this.channels[0]? this.channels[0].id:null,
【讨论】:
【参考方案2】:您是否在 chrome 上检查了 channels
和 Vue Devtools 的数据?
您可以尝试更改以下行。
this.channels = resp.data.channels;
到 this.channels = JSON.parse(resp.data.channels);
【讨论】:
以上是关于子组件中修改props的正确方式的主要内容,如果未能解决你的问题,请参考以下文章
Vue prop传一个对象给子组件,怎么避免子组件修改数据污染父组件?