关于computed、watchEffect及响应式数据

关于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定义的响应式数据到底起什么作用?怎么起作用的?

请老师帮忙解答一下以上问题,谢谢!

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,对于你的问题解答如下:

1、computed计算属性,是当依赖的数据发生变化时会自动执行,其中依赖的数据需要是响应式的,这样理解才是对的。

2、同学举例的这段代码,因为计算属性内部所依赖的数据,没有定义为响应式数据,而通过计算属性得到的caculations不具备响应式数据的功能,所以无法实现效果。老师举一个简单的示例,帮助同学更好的理解。

示例:代码中的计算属性test依赖的数据name没有定义为响应式数据,那么两秒过后更改name的值,并不会重新计算test的值,所以页面中显示的一直是1

http://img1.sycdn.imooc.com//climg/60715053090901f208550549.jpg

而将name使用ref方法改为响应式之后,两秒之后改变name的值,也会重新计算test的值,页面中先展示1,两秒后展示2

http://img1.sycdn.imooc.com//climg/6071514f09674b7307290507.jpg

3、watch是用来监听数据的,当监听的数据发生变化时,会执行对应的函数,这里要监听的数据也必须是响应式的数据才可以。

4、ref和reative定义的响应式数据,只要该数据发生变化,相应的页面中展示的对应数据也会跟着发生改变。

5、ref和reative的主要应用场景就是:当你改变一个数据时,希望页面中展示的这个数据也跟着发生改变,那么就可以使用ref或者reative处理下这个数据。

6、因为直接通过ajax获取的接口数据,并不具备响应式,直接渲染到页面的话,那么更改数据的时候,页面上展示的内容并不会发生变化,所以需要使用ref或者reactive方法将数据设置为响应式的。

7、由于不清楚同学完整代码是怎么写的,老师使用定时器简单模拟了下同学的代码思路,如下图所示:

http://img1.sycdn.imooc.com//climg/60715ed709a60a0108520361.jpg

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 


祝学习愉快~

  • 慕妹8003063 提问者 #1

    非常感谢好帮手慕慕子老师的细致解答。我还想明确一点,就是后端接口数据发生变化时,watchEffect里面提交后端数据的函数会不会重新执行,谢谢老师!

    2021-04-11 00:14:42
  • 慕妹8003063 提问者 #2

    抱歉,是提取后端数据的函数。

    2021-04-11 00:16:34
  • 慕妹8003063 提问者 #3

    我还想问一个问题,慕慕子老师说,computed计算属性所依赖的数据需要是响应式数据。我给的computed例子的代码里面的数据是Vue仓库store里的数据,store里的数据发生变化时,computed是不是也会重新计算呢?

    2021-04-11 01:42:19
好帮手慕言 2021-04-11 16:20:23

同学你好,解答如下:

1、后端小伙伴改变接口里面的数据,不会重新执行watchEffect里面的函数,如果想要拿到修改后的数据,需要再次请求接口。

2、store里面的数据发生变化,computed是会重新执行的。

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师