vue3中的setup,vue3.0的setup()函数

  vue3中的setup,vue3.0的setup()函数

  本文主要介绍Vue3编程流畅技巧,并讲解利用setup语法sugar拒绝写回车的方法。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  

目录

   Vue3.2设置语法糖1 .脚本设置引入模板/用法时会自动注册2 .3.组件通信:定义Props而不是propsdefineEmit而不是emit4。脚本设置需要主动向父组件公开子组件属性:defineExpose5。语法糖其他功能。在设置中访问路线。

  

Vue3.2 setup语法糖

  Vue3.2安装语法糖[单个文件组件脚本安装的语法糖]

  如果你对Vue3语法糖有所了解,不如和我的另一篇文章一起吃!Vue3必须学习技能-定制钩子-让编写Vue3更愉快

  本来默认情况下,你已经对Vue3.0的composition API有所了解,但是你被setup函数中需要繁琐的变量和与return相关的函数所困扰,所以你会从setup的语法糖脚本设置中有所收获。sugar脚本设置的引入,让你写Vue3更爽,让Vue3更丰满。这篇文章是根据官方文件写的。有时间的话,建议去官方文件里看看。这篇文章更有语义,更通俗。我希望你会喜欢它。

  脚本设置是一个编译时语法糖,它在单个文件组件(SFC)中使用复合API。

  为了解决Vue3.0中的setup需要繁琐的通过return公开声明的变量、函数和导入内容才能在template/中使用的问题。

  

1.script setup在template/使用

  脚本设置可以在模板中使用/不使用由return声明的变量和函数以及由import引入的内容。

  脚本设置语法糖

  脚本设置

  //导入引入的内容

  从导入{ getToday }。/utils

  //变量

  const msg=你好!

  //函数

  函数日志(){

  console.log(消息)

  }

  /脚本

  //在模板中直接使用声明的变量、函数和import引入的内容

  模板

  div @ click= log“{ msg } }/div

  p{{getToday()}}/p

  /模板

  标准组件脚本需要编写设置函数,重新运行起来很麻烦。

  脚本

  //导入引入的内容

  从导入{ getToday }。/utils

  导出默认值{

  setup(){

  //变量

  const msg=你好!

  //函数

  函数日志(){

  console.log(消息)

  }

  //如果要在tempate中使用它,需要在setup中公开返回

  返回{

  味精,

  日志,

  今天到了

  }

  }

  }

  /脚本

  模板

  div @ click= log“{ msg } }/div

  p{{getToday()}}/p

  /模板

  总结:脚本设置语法sugar中的代码会编译成组件setup()函数的内容,可以在template/中使用,不需要通过return暴露声明的变量、函数和导入的内容,也不需要写export default{}

  脚本设置语法sugar中的代码将被编译成组件setup()函数的内容。这意味着,与首次引入组件时只执行一次的通用脚本不同,脚本设置中的代码将从010到59000。

  脚本

  console.log(脚本);//多次实例化组件,只触发一次。

  导出默认值{

  setup() {

  console . log( setupFn );//每次组件被实例化时,都会触发与script-setup标记相同的事件。

  }

  }

  /脚本

  (script-setup标记最终将被编译到setup()函数的内容中。每实例化一个组件,设置函数就实例化一次。脚本标签中的setup函数也是如此。每次实例化一个组件,就实例化了一次设置函数。但是脚本标签设置需要写在导出默认{},另一个只在第一次导入的时候执行一次。)

  

2、script setup引入组件将自动注册

  不需要通过组件注册组件:{}介绍完之后,就可以直接使用了。

  lt;脚本安装gt。

  从导入MyComponent。/MyComponent.vue

  //组件:{MyComponent}无需注册即可直接使用。

  lt;/scriptgt。

  lt;模板gt。

  nbsplt;MyComponent /gt。

  lt;/templategt。

  

3、组件通信:

  在脚本设置中,必须使用defineProps和define emissions API来代替Props和emissions。

  DefineProps和defineEmits有完整的类型推断,在脚本设置上是每次组件实例被创建的时候执行(浏览掘金后发现大部分文章demo还是通过import引入这两个API,官方文档里写的很清楚)

  

defineProps 代替props

  接收父组件传递的数据(父组件将参数传递给子组件)

  父组件:

  模板

  父分区组件/分区

  Child :title=msg /

  /模板

  脚本设置

  从“vue”导入{ref}

  从导入子级。/child.vue

  Const msg=ref(父代值)//自动返回,直接在模板中使用。

  /脚本

  子组件:

  父组件传递的道具可以直接用在template/(props。可以省略)

  脚本设置需要通过props.xx获得父组件传递的props

  模板

  div /div的子组件

  div的父组件传递的值:{{title}}/div

  /模板

  脚本设置

  //不需要引入从“vue”导入{defineProps}。

  //语法糖一定要用defineProps而不是Props。

  const props=defineProps({

  标题:{

  类型:字符串

  }

  });

  //script-setup需要通过props.xx获取父组件传递的道具

  Console.log(props.title) //父级的值

  /脚本

  

defineEmit 代替emit

  子组件向父组件传输数据(子组件向外部公开数据)

  子组件代码:

  模板

  div /div的子组件

  Button @click=toEmits 子组件公开数据/button

  /模板

  脚本设置

  从“vue”导入{ref}

  Const name=ref(我是子组件)

  //1.公开内部数据

  const emisses=define emits([ child fn ]);

  const toEmits=()={

  //2.触发父组件中公开的childFn方法并携带数据。

  发出( childFn ,name)

  }

  /脚本

  父组件代码:

  模板

  父分区组件/分区

  Child @childFn=childFn /

  子组件传递的前数据{ { childdata } }

  /模板

  脚本设置

  从“vue”导入{ref}

  从导入子级。/child.vue

  const childData=ref(null)

  const childFn=(e)={

  Consloe.log(子组件触发了父组件childFn并传递了参数e )

  子数据=e .值

  }

  /脚本

  

4.script setup需主动向父组件暴露子组件属性 :defineExpose

  对于使用脚本设置的组件,父组件无法通过ref或$parent获取子组件的ref等响应数据,需要通过defineExpose主动公开。

  子组件代码:

  脚本设置

  从“vue”导入{ ref }

  常数a=1

  常数b=ref(2)

  //主动公开组件属性

  defineExpose({

  一,

  b

  })

  /脚本

  父组件代码:

  模板

  父分区组件/分区

  Child ref=childRef /

  Button @click=getChildData 通过ref /button获取子组件的属性

  /模板

  脚本设置

  从“vue”导入{ref}

  从导入子级。/child.vue

  const children=ref()//注册响应数据

  const getChildData=()={

  //子组件接收公开的值

  console . log(child ref . value . a)//1

  console . log(children . value . b)//2响应数据

  }

  /脚本

  

5.语法糖其他功能

  UseSlots和useAttrs (直接可用的,由于大多数人都是在SFC模式下开发,所以可以在template/through slots/tag中渲染插槽)

  如果你需要在脚本设置中使用插槽和属性,你需要使用插槽和属性。

  需要导入{useslots,useattrs}表单“vue”。

  通过模板中的$slots和$attrs访问更方便/(attrs用于获取父组件中传递给子组件的非props的参数/方法,attrs用于获取父组件中传递给子组件的非props的参数/方法,slots可以获取父组件中slots传递的虚拟dom对象,在SFC模式和JSX /TSX中应该用处不大。

  父组件:

  模板

  child msg= attrs接收非porps值传递子组件

  !匿名投币口

  Span默认插槽/span

  !-命名插槽-

  模板#标题

  H1命名插槽/h1

  /模板

  !-范围插槽-

  template # footer=“{ scope }”

  页脚作用域槽3354名称:{{ scope.name }},年龄{ { scope . age } }/页脚

  /模板

  /孩子

  /模板

  脚本设置

  //引入子组件

  从导入子级。/child.vue

  /脚本

  子组件:

  模板

  !匿名投币口

  插槽/

  !-命名插槽-

  slot name=title /

  !-范围插槽-

  slot name=“footer”:scope=“state”/

  !- $attrs用于获取不是父组件中的属性的参数,并传递给子组件-

  p{{ attrs.msg==$attrs.msg }}/p

  !-没错,我没想到会有用.

  p{{ slots==$slots }}/p

  /模板

  脚本设置

  从“vue”导入{ useSlots,useAttrs,reactive,toRef }

  恒定状态=反应({

  姓名:张三,

  年龄:“18岁”

  })

  const slots=useSlots()

  console . log(slots . default());//获取默认插槽的虚拟dom对象

  console . log(slots . title());//获取命名标题槽的虚拟dom对象

  //console . log(slots . footer());//报告错误。不知道为什么带槽scope的不能收购。

  //useAttrs()用于获取父组件传递的属性数据(即非props的属性值)。

  const attrs=useAttrs()

  /脚本

  在JSX/TSX治下,UseSlots可能更实用。

  如果你想在vite中使用jsx语法,你需要下载与jsx相关的插件来识别JSX。

  UseSlots可以获取父组件传递的槽的虚拟dom对象,可以用来呈现槽的内容。

  脚本语言=jsx

  从“vue”导入{ defineComponent,use slots };

  导出默认定义组件({

  setup() {

  //获取插槽数据

  const slots=use slots();

  //呈现组件

  return ()=(

  差异

  {插槽. default?slots.default():}

  {插槽. title?slots.title():}

  /div

  );

  },

  });

  /脚本

  大部分人都是SFC模式开发,槽可以用模板/通过槽/标签渲染。这种JSX书写方法应该很少有人使用。

  

6.在setup访问路由

  访问路由实例组件信息:这在route和routersetup中是无法访问的。$路由器或者这个。无法再直接访问$route。(getCurrentInstance可以替换它,但不推荐)

  建议:用useRoute函数和useroute函数代替这个。$route和这个。$路由器。

  脚本设置

  从“vue路由器”导入{ useRouter,useRoute }

  const route=useRoute()

  const router=useRouter()

  函数pushWithQuery(查询){

  router.push({

  名称:“搜索”,

  查询:{

  .路由查询,

  },

  })

  }

  脚本/

  导航防护仍然可以使用路由实例组件的导航防护。

  从导入路由器。/路由器

  router.beforeEach((收件人,发件人,下一个)={

  })

  还可以使用组合api的导航守护onbeforrouteleave、onbeforrouteupdate。

  脚本设置

  从“vue-router”导入{ onBeforeRouteLeave,onBeforeRouteUpdate }

  //与beforeRouteLeave相同,不能访问。

  onBeforeRouteLeave((收件人,发件人)={

  const answer=window.confirm(

  你真的想离开吗?您有未保存的更改!

  )

  //取消导航并停留在同一页面

  如果(!回答)返回false

  })

  const userData=ref()

  //与beforeRouteUpdate相同,无法访问。

  onbeforeroutupdate(async(to,from)={

  //仅在id更改时获取用户,例如,仅查询或哈希值更改

  if (to.params.id!==from.params.id) {

  user data . value=await fetchUser(to . params . id)

  }

  })

  脚本/

  复合API防护也可以用在router-view 渲染的任何组件中,它们不必像组件内防护那样直接用在路由组件上。

  总结:setup的语法糖,作为Vue3的补充,让Vue3更饱满,让写Vue3更有乐趣。如果你觉得文笔不错,就不要吝啬。走之前给我点赞!

  如果看完觉得意犹未尽,那就好像你没有拿到Vue3。有什么好的?请了解一下Vue3的自定义挂钩!

  自定义挂钩的Vue3可能就是Vue3的完整体了!因为有些人看完这篇文章还觉得把Vue3函数和变量一起写不优雅!看看这篇文章吧!

  Vue3编程流畅技巧定制挂钩

  以上是Vue3编程流畅技巧使用设置语法糖拒绝写返回的详细内容。更多关于Vue3编程设置语法糖的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: