uni-app使用watch监听数据,当数据变化时页面没有根据变化数据渲染解决方法

uni-app使用<Fudian :fenshuj="fenshuj"></Fudian>父传子数据时,子组件通过

import { ref, onMounted, watch, watchEffect, defineProps } from "vue";

const props = defineProps({

fenshuj: {

type: String,

required: true

}

});

接收数据,想要实现子组件根据父组件传过来的内容实时更新,可以使用watch监听数据的改变,但是会发现监听到数据发生改变了但是页面并没有根据新改变的内容做一个重新渲染,可以使用watchEffect来触发组件的重新渲染

示例:带分页的表格

<template>
	<view>
		<th-table :column="column" :listData="data" :checkSort="checkSort" :st="st" :sr="sr" :tdClick="tdClick"
			height="0.5" :stripe="true" :border="true" :loading="false">
			<template v-slot:b="Props">
				<span style="color: red;">{{ Props.item.b }}</span>
			</template>
			<template v-slot:c="Props">
				<span style="color: green;" @click="log(Props.item)">{{ Props.item.c }}</span>
			</template>
			<template v-slot:a="Props">
				<div style="color: pink;">{{ Props.item.a }}</div>
				<div>{{ Props.item.e }}</div>
			</template>
		</th-table>
		<view class="pagination">
			<button @click="prevPage" :disabled="pageNo === 1">上一页</button>
			<view class="pagina_q">
				<view>
					页码 {{ pageNo }}/{{ totalPages }}
				</view>
			</view>
			<button @click="nextPage" :disabled="pageNo === totalPages">下一页</button>
		</view>
	</view>
</template>

<script setup lang="ts">
	import { ref, onMounted, watch, watchEffect, defineProps } from "vue";
	const props = defineProps({
		fenshuj: {
			type: String,
			required: true
		}
	});

	const fenshuj = ref({});
	const nair = ref();

	// 表头配置参数
	const column = ref([
		{
			title: '时间',
			isSort: false,
			isFixed: false,
			key: 'dataTime'
		},
		{
			title: '电费',
			isSort: true,
			isFixed: false,
			key: 'powerPrice'
		}
	]);
	// 表身数据
	const data = ref([]);

	// 排序字段
	const st = ref('b');
	// 排序 1降序 -1升序
	const sr = ref(-1);

	// 切换排序事件
	const checkSort = (name : string, type : number) => {
		st.value = name;
		sr.value = type;
	};
	// 模拟请求数据
	setTimeout(() => {
		data.value = nair.value;
	}, 500);

	// 分页相关
	const pageNo = ref(1);

	// 计算总页数
	const totalPages = ref();
	// 分页操作
	const nextPage = () => {
		if (pageNo.value < totalPages.value) {
			pageNo.value += 1;
			uni.$emit('pageNoChange', pageNo.value);
		}
	};
	const prevPage = () => {
		if (pageNo.value > 1) {
			pageNo.value -= 1;
			uni.$emit('pageNoChange', pageNo.value);
		}
	};

	onMounted(() => {
		uni.$emit('pageNoChange', pageNo.value);
	});

	// 监听 props.fenshuj 的变化
	watch(() => props.fenshuj, (newVal) => {
		fenshuj.value = newVal;
		// 检查 newVal 是否为 undefined
		if (newVal) {
			totalPages.value = newVal.pageTotal;
			if (fenshuj.value && fenshuj.value.data && fenshuj.value.data.tableData) {
				nair.value = fenshuj.value.data.tableData;
				data.value = nair.value; // 手动更新 data.value
			}
		} else {
			console.warn("fenshuj 的值为 undefined");
		}
	}, { immediate: true });

	// 使用 watchEffect 确保数据更新后能够正确触发组件的重新渲染
	watchEffect(() => {
		if (fenshuj.value && fenshuj.value.data && fenshuj.value.data.tableData) {
			nair.value = fenshuj.value.data.tableData;
			data.value = nair.value; // 手动更新 data.value
		}
		if (fenshuj.value && fenshuj.value.pageTotal) {
			totalPages.value = fenshuj.value.pageTotal;
		}
	});
</script>
相关推荐
如鹿觅水14 分钟前
通过JS删除当前域名中的全部COOKIE教程
服务器·前端·javascript
#sakura15 分钟前
web-02
前端
Lipn19 分钟前
前端怎么获取视口大小
开发语言·前端·javascript
晓风伴月19 分钟前
腾讯IM web版本实现迅飞语音听写(流式版)
前端·语音识别·讯飞语音听写
开心工作室_kaic1 小时前
ssm126基于HTML5的出租车管理系统+jsp(论文+源码)_kaic
java·前端·html5
卷心菜是俺2 小时前
Sping全面复习
java·开发语言·数据库·junit·java-ee·log4j·maven
是老余2 小时前
算法之二分查找优化:leetcode34:在排序数组中查找元素的第一个和最后一个位置
java·开发语言·算法
超*2 小时前
腾讯云产品推荐----域名的使用
前端·javascript·腾讯云
fa_lsyk2 小时前
Spring:bean的配置
java·后端·spring
bug修复机器人2 小时前
springBoot项目中,参数更改为配置文件
java·spring boot·spring