关于computed、watchEffect及响应式数据
computed计算属性,是当依赖的数据发生变化时会自动执行,象下面这段代码
const caculations = computed(() => {
let result = {
sumNum: 0,
sumPrice: 0,
goodsList: {},
purchaseList:[],
shopName:"",
isCartAllSelect: true
};
result.goodsList = cartList[shopId]?.goodsList;
result.shopName = cartList[shopId]?.shopName;
if (result.goodsList) {
for (let i in result.goodsList) {
const goods = result.goodsList[i];
result.sumNum += goods.count;
if (goods.check) {
result.sumPrice += goods.count * goods.price;
}
if (goods.count > 0 && !goods.check) {
result.isCartAllSelect = false;
}
if(goods.count > 0 && goods.check ){
result.purchaseList.push(goods);
}
}
}
result.sumPrice = result.sumPrice.toFixed(2);
return result;
});
因此,它里面的变量不需要定义成响应式数据,通过计算属性得到的caculations已经有了响应式数据的功能,是这样吗?
而watchs是监听数据,当某个数据发生变化时,会重新执行函数?
那么,用ref或reactive定义的响应式数据呢?当它所依赖的数据发生变化时,也会重新执行相应函数重新得到吗?ref或reactive主要应用在什么场景?我学习的课程里,好像所有通过ajax得到的接口数据,都定义为ref或reactive,这是为什么?
下面这段代码:
const useCurrentListEffect = (currentTab, shopId) => {
// const data = reactive({ contentList: [] });
const contentList = ref([]);
const getContentData = async () => {
const shop_id=shopId.slice(1)
axios.defaults.baseURL ="http://localhost:3000";
axios.defaults.withCredentials=true;
await axios
.get(`/api/shop/${shop_id}/goods`, {
params: { tab: currentTab.value }
})
.then(res => {
if (res.data.errno == 0 && res.data.data) {
contentList.value = res.data.data;
}
})
.catch(err => {
console.log(err);
});
};
watchEffect(() => {
getContentData();
});
// const { contentList } = toRefs(data);
return { contentList };
};
已经将获取接口数据的变量contentList定义成了响应式数据,那么,不是接口数据变化时,contentList会重新获取到数据吗?还是说,定义为响应式数据,只意味着它是可变的(那么,这和变量也有何区别?),并不会在后端数据发生时重新获取数据?因此需要使用watchEffect来监听数据的变化?那么,watchEffect可以实现,当后端数据发生变化时,自动重新执行函数获取数据?
我一直搞不太懂用ref或reactive定义的响应式数据到底起什么作用?怎么起作用的?
请老师帮忙解答一下以上问题,谢谢!
正在回答
同学你好,对于你的问题解答如下:
1、computed计算属性,是当依赖的数据发生变化时会自动执行,其中依赖的数据需要是响应式的,这样理解才是对的。
2、同学举例的这段代码,因为计算属性内部所依赖的数据,没有定义为响应式数据,而通过计算属性得到的caculations不具备响应式数据的功能,所以无法实现效果。老师举一个简单的示例,帮助同学更好的理解。
示例:代码中的计算属性test依赖的数据name没有定义为响应式数据,那么两秒过后更改name的值,并不会重新计算test的值,所以页面中显示的一直是1
而将name使用ref方法改为响应式之后,两秒之后改变name的值,也会重新计算test的值,页面中先展示1,两秒后展示2
3、watch是用来监听数据的,当监听的数据发生变化时,会执行对应的函数,这里要监听的数据也必须是响应式的数据才可以。
4、ref和reative定义的响应式数据,只要该数据发生变化,相应的页面中展示的对应数据也会跟着发生改变。
5、ref和reative的主要应用场景就是:当你改变一个数据时,希望页面中展示的这个数据也跟着发生改变,那么就可以使用ref或者reative处理下这个数据。
6、因为直接通过ajax获取的接口数据,并不具备响应式,直接渲染到页面的话,那么更改数据的时候,页面上展示的内容并不会发生变化,所以需要使用ref或者reactive方法将数据设置为响应式的。
7、由于不清楚同学完整代码是怎么写的,老师使用定时器简单模拟了下同学的代码思路,如下图所示:
1秒后contentList数据发生变化后,页面中显示的内容也会跟着改变。
8、定义为响应式数据的作用是:当数据发生变时,页面中使用该数据的地方也会跟着发生改变。
9、watchEffect方法监听数据时,只要该方法中依赖的数据发生变化,就会再次执行该函数。能够灵活应用所学知识实现效果,说明同学实践能力很强哦,真棒!!!
10、在第8条中,已经解答过了响应式数据的作用,同学也可以回顾下基础课程对于ref和reactive的讲解,加深理解与记忆。
https://class.imooc.com/lesson/1873#mid=42086
https://class.imooc.com/lesson/1873#mid=42087
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星