千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:贵阳千锋IT培训  >  技术干货  >  Vue3的组合式Api为什么能在条件和循环语句中使用?

Vue3的组合式Api为什么能在条件和循环语句中使用?

来源:千锋教育
发布人:qyf
时间: 2023-02-16 20:06:43

Vue3的组合式Api为什么能在条件和循环语句中使用

  因为 Vue 3 的 setup 并不是一个常规函数,而是含有一个闭包(闭包 = 自由变量 + 函数)的函数。代码如下:

  export const Fang = defineComponent({

  props: ...,

  setup: ()=>{

  const a = ref(0)

  const b = ref(0)

  return () => ( // 此箭头函数记为 fnReturn

{a.value} {b.value}

  )

  }

  })

  此处使用 JSX 语法,以方便与 React 做对比。

  当你用 b.value += 1 触发 re-render 时,并不会重新执行 setup 函数,只会重新执行fnReturn,因此 Vue 根本就不需要找 a 和 b(想找也找不到,原因跟 React 一样,Vue 只知道你拿走了 ref(0) 的返回值),因为 a 和 b 都是 fnReturn 可以直接读到的自由变量啊!换句话说,a、b、fnReturn 三者组成了闭包,这个闭包会一直维持着 a 和 b 变量,提供给 fnReturn 访问。

  Vue 3 只需要调用 fnReturn 即可。

  理论上,你甚至可以把 a = ref(0) 写在 setup 外面!就像这样:

  const a = ref(0)

  const b = ref(0)

  export const Fang = defineComponent({

  props: ...,

  setup: ()=>{

  return () => ( // fnReturn

{a.value} {b.value}

  )

  }

  })

  这样写完全没有问题,因为 fnReturn 依然可以访问 a 和 b。

  所以你也完全可以把 a 放在 if 里,只要 a 能被 fnReturn 访问就行:

  export const Fang = defineComponent({

  props: ...,

  setup: ()=>{

  let a

  if(window.name === 'Fang'){

  a = ref(0)

  }

  const b = ref(0)

  return () => (

  {a && a.value} //a 有可能是 undefined,所以要判断一下

  {b.value}

  )

  }

  })

  此时你可能会想,Vue 3 这么方便肯定会有什么缺点吧?总不会完爆 React 吧?

  其实缺点也有,那就是会让代码里出现很多 .value。还好 SFC 可以帮我们减少 template 里的 .value。

  你说,Vue 3 如果能做到用 b += 1 来改变 b 的值不就不用写 .value 了?

  但问题在于 JS 并没有提供这种「监听变量被重新赋值」的能力给开发者,所以 Vue 3 做不到这一点。JS 只提供了「监听对象的属性被重新赋值」的能力,所以 Vue 3 可以监听对象 b 的 value 是否被重新赋值。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

MyBatis是什么?

2023-06-06

Vue中组件和插件有什么区别?

2023-02-17

vue递归菜单实现权限关联菜单

2023-02-16

最新文章NEW

Vue项目中如何解决跨域?

2023-02-17

Vue双向数据绑定是什么?

2023-02-17

vue和react之间的共同点以及不同点

2023-02-17

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>