起因: 小说网站换了域名,导致无法加载小说封面
暂时解决思路: 使用默认图片代替
后期解决办法: 使用FastDFS存入自己服务器
现象
父组件传入rangkingList给子组件,子组件修改数组里的picUrl,但是父组件并没有渲染
解决过程
使用wactch监视rangkingList
// 子组件
export default
{
name: 'ChildComponent',
props: ['rankingList'],
watch: {
rankingList:
{
handler(newValue)
{
console.log('Ranking list:', newValue); // 在这里进行你想要的操作,例如更新数据或触发其他方法
},
deep: true, // 如果 rankingList 是一个数组或对象,使用 deep 选项进行深度监听
},
},
// ...
}
控制台打印发现成功赋值的,右键审查页面图片发现并没有改变
猜想
子组件改变props里的值后,需要重新提交给父组件,父组件在传给子组件进行渲染即可
代码
父组件
<view slot="content0" class="aloysTabContent">
<manRanking :rankingList="rankingList" @update:rankingList="updateRankingList"></manRanking>
<view class="isOver" v-if="flag">-----数据已经到底了------</view>
</view>
method:
updateRankingList(newRankingList) {
// 使用修改后的 rankingList 更新父组件的数据
this.rankingList = newRankingList;
},
子组件
<view class="box" v-for="(item, index) in rankingList" :key="index">
<view class="books" @click="bookDetailClick({ item })">
<image
class="img"
:src="item.picUrl"
@error="imagerror($event, index)"
mode="widthFix"
style="width: 150rpx"
></image>
imagerror: function (e, img_index) {
var _this = this;
var modifiedRankingList = [..._this.rankingList]; // 创建一个新的数组作为 modifiedRankingList
if (_this.rankingList.length > 0) {
modifiedRankingList[img_index].picUrl = "../../static/default.gif";
}
// 触发自定义事件,将修改后的 rankingList 传递给父组件
this.$emit("update:rankingList", modifiedRankingList);
},
文言一心回答
在Vue.js中,当子组件通过props接收父组件的内容并进行修改时,通常不建议直接修改props,因为这可能会导致预期之外的应用行为。相反,建议通过触发一个自定义事件来通知父组件更新数据。
以下是一种常见的方法来实现这个目标:
- 在子组件中,使用
$emit
方法触发一个自定义事件,例如update:rankingList
。将修改后的rankingList
作为参数传递给该事件。
子组件示例代码:
<template>
<!-- 子组件模板 -->
</template>
<script>
export default {
props: ['rankingList'],
methods: {
updatePicUrl() {
// 修改 rankingList 中的 picUrl
// ...
// 触发自定义事件,将修改后的 rankingList 传递给父组件
this.$emit('update:rankingList', modifiedRankingList); }
}
}
</script>
- 在父组件中,使用
v-on
指令(或简写形式@
)来监听子组件触发的update:rankingList
事件。在事件处理函数中,使用修改后的rankingList
来更新父组件的数据,从而触发重新渲染。
父组件示例代码:
<template>
<div>
<manRanking :rankingList="rankingList" @update:rankingList="updateRankingList">
</manRanking>
<!-- 其他代码 -->
</div>
</template>
<script>
export default {
data() {
return {
rankingList: [/* 初始的 rankingList 数据 */]
}
},
methods: {
updateRankingList(newRankingList) {
// 使用修改后的 rankingList 更新父组件的数据
this.rankingList = newRankingList;
}
}
}
</script>
这样,当子组件修改了rankingList
中的picUrl
并触发update:rankingList
事件时,父组件会响应该事件并使用修改后的rankingList
数据进行重新渲染。