setup获取props和自定义事件、通过expose暴露给ref获取属性和方法、setup顶层async、setup返回函数

38 篇文章 4 订阅
订阅专栏


1. setup获取props和自定义事件

child 组件:

<template>
  <div>
    <h3>我是child组件 -- {{ title }}</h3>
    <button @click="setTitle">修改父title中的数据</button>
  </div>
</template>

<script>
export default {
  // props单向数据流,子不能修改父
  // 写法1:
  // props: ['title'],

  // 写法2:
  props: {
    title: {
      type: String
    }
  },
  // setup里面不能使用this,在此处this它的指向为undefined
  // 参数1:props对象,可以用它来接受props数据,但是此对象一定不能解构
  // 参数2:context对象,里面包含了 slots emit expose attrs

  setup(props, { emit }) {
    console.log(props.title)
    // console.log(slots)
    const setTitle = () => {
      // 发送一个自定义事件,让父组件去绑定实现,这样完成修改title
      emit('onSetTitle', Date.now() + ' - @@')
    }

    return { setTitle }
  }
}
</script>

<style lang="scss" scoped>

</style>

父组件:

<template>
  <div>
    <child  :title="title" @onSetTitle="setTitle">aaaa</child>
  </div>
</template>

<script>
import { ref } from 'vue'
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    const title = ref('我是父组件标题')

    const setTitle = tit => {
      title.value = tit
    }

    return { title, setTitle }
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

2. 通过expose暴露给ref获取属性和方法

child组件:

<template>
  <div>
    <h3>我是child组件 -- {{ title }}</h3>
    <button @click="setTitle">修改父title中的数据</button>
  </div>
</template>

<script>
export default {
  // props单向数据流,子不能修改父
  // 写法1:
  // props: ['title'],

  // 写法2:
  props: {
    title: {
      type: String
    }
  },

  // setup里面不能使用this,在此处this它的指向为undefined
  // 参数1:props对象,可以用它来接受props数据,但是此对象一定不能解构
  // 参数2:context对象,里面包含了 slots emit expose attrs
  setup(props, { emit, expose }) {
    console.log(props.title)
    const setTitle = () => {
      // 发送一个自定义事件,让父组件去绑定实现,这样完成修改title
      emit('onSetTitle', Date.now() + ' - @@')
    }

    // expose 如果你不用它,则在父组件中使用ref得到当前的实例,并且里面所有的方法和属性你都能调用,没有封装性。使用它后,你可以指定需要暴露给父组件ref调用的方法或属性。
    expose({
      name: 'abc'
    })

    return { setTitle }
  }
}
</script>

<style lang="scss" scoped>

</style>

父组件:

<template>
  <div>
    <child ref="childRef" :title="title" @onSetTitle="setTitle">aaaa</child>
  </div>
</template>

<script>
import { ref } from 'vue'
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    const title = ref('我是父组件标题')
    const childRef = ref(null)

    const setTitle = tit => {
      title.value = tit

      console.log(childRef.value)
    }

    return { title, setTitle, childRef }
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

3. setup顶层async

当 setup 需要返回一个 promise 对象时,即在顶层 setup 前添加 async 必须使用 Suspense 包裹,否则会报错。也就是说,当你的 async 不是加在顶层 setup 上时,不用拿 Suspense 包裹。

子组件:

<template>
  <div>
    <h3>我是child组件</h3>
    <button>修改父title中的数据</button>
  </div>
</template>

<script>
export default {
  // setup需要返回一个 {} | ()=>{} | promise=> 必须使用 Suspense包裹
  // 顶层async
  async setup() {
    return {  }
  }
}
</script>

<style lang="scss" scoped></style>

父组件:

<template>
  <div>
    <Suspense>
        <child />
    </Suspense>
  </div>
</template>

<script>
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    return {}
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

于是我们就可以在子组件中通过 axios 进行网络请求。

子组件:

<template>
  <div>
    <h3>我是child组件</h3>
    <button>修改父title中的数据</button>
  </div>
</template>

<script>
import axios from 'axios'
import { onMounted, ref } from 'vue'
export default {
  // setup需要返回一个 {} | ()=>{} | promise=> 必须使用 Suspense包裹
  // 顶层async
  async setup() {
    let films = ref([])

    onMounted(async () => {
      let ret = await axios.get(
        'https://api.iynn.cn/film/api/v1/getNowPlayingFilmList?cors=T&cityId=110100&pageNum=1&pageSize=10'
      )
      films.value = ret.data.data.films
    })

    return { films }
  }
}
</script>

<style lang="scss" scoped></style>

父组件:

<template>
  <div>
    <Suspense>
        <child />
    </Suspense>
  </div>
</template>

<script>
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    return {}
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

异步组件 + setup 配置顶层 async + Suspense 组件中的 default 和 fallback:

子组件:

<template>
  <div>
    <h3>我是child组件</h3>
    <button>修改父title中的数据</button>
  </div>
</template>

<script>
import axios from 'axios'
import { onMounted, ref } from 'vue'
export default {
  // setup需要返回一个 {} | ()=>{} | promise=> 必须使用 Suspense包裹
  // 顶层async
  async setup() {
    let films = ref([])

    onMounted(async () => {
      let ret = await axios.get(
        'https://api.iynn.cn/film/api/v1/getNowPlayingFilmList?cors=T&cityId=110100&pageNum=1&pageSize=10'
      )
      films.value = ret.data.data.films
    })

    return { films }
  }
}
</script>

<style lang="scss" scoped></style>

父组件:

<template>
  <div>
    <Suspense>
      <!-- 成功显示的 -->
      <template #default>
        <child />
      </template>
      <!-- 加载中显示的 -->
      <template #fallback>
        <loading />
      </template>
    </Suspense>
  </div>
</template>

<script>
import { ref, defineAsyncComponent } from 'vue'
// 异步组件 + setup配置选项顶层 async  配合 Suspense 组件
const child = defineAsyncComponent(() => import('./components/child.vue'))
export default {
  components: { child },
  setup() {
    return {}
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

4. setup返回函数

返回函数 ,它就相当于 render方法,不需要 template 模板。

子组件:

<script>
import { ref, h } from 'vue'
export default {
  // 返回函数  它就相当于 render方法,模板,不需要template
  setup() {
    return () => {
      return h('div', null, [
        h('h3', null, '我是一个标题'),
        h(
          'button',
          {
            onClick: () => console.log('我是点击事件')
          },
          '按钮'
        )
      ])
    }
  }
}
</script>

父组件:

<template>
  <div>
    <child />
  </div>
</template>

<script>
// import { ref } from 'vue'
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    return {}
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

也可以用 jsx 语法实现上面的需求:

父组件:

<template>
  <div>
    <child />
  </div>
</template>

<script>
import child from './components/child'
export default {
  components: { child },
  setup() {
    return {}
  }
}
</script>

<style lang="scss" scoped></style>

子组件(快捷键 rfc):

const Child = () => {
  return (
    <div>
      <h3>jsx</h3>
      <button>jsx</button>
    </div>
  )
}

export default Child

在这里插入图片描述

VueJs中setup的使用(下)
itclanCoder
12-27 1761
前言在Vue当中,父组件想要向子组件传值,是通过在父组件标签上通过自定义属性实现的,而在子组件中是通过props进行接收在Vue2.0里面,在子组件中的选项式API配置项选项中props进行接收就可以了的,在子组件中的模板中可以直接使用但在Vue3里面与Vue2.0存在一些差异,这个主要是针对组合式API的setup函数01setup函数接收第一个参数propssetup函数的第一个参数是接收父组...
Vue3中setup()函数收到的两个比较重要的值:props和context(和自定义事件有关)
ChuanyangChen的博客
05-26 2028
Vue3中setup()函数收到的两个比较重要的值 setup()函数能接收到两个形参,一个是props,另外一个是context。props即父组件传递给子组件的参数,context意思是上下文,里面有一个emit('事件名', 事件回调函数收到的值)函数比较常用,可替代vue2绑定在vm身上的this.$emit('事件名', 事件回调函数收到的值); 子组件: <template> <h3>{{person.name}}</h3> <h3>{{p
13.setup.props
qq_34820433的博客
05-04 734
PS:注意,这里不要使用 setup({title})解构,会丢失响应式,props 本身是响应式的;1. 在 setup()函数中,第一个参数可以传递 props,用于组件之间的通信;本节课我们来要了解一下 Vue3.x 中的 setup()下 props 用法;2. 我们可以先创建一个子组件 Child.vue,然后被父组件调用导入;PS:并且,props.title 是只读的,无法通过这个改变;props.title = 'Mr.Lee' // 只读,不可变。
Vue2进阶Vue3——组件\插槽:setup()函数
m0_73548338的博客
08-05 648
插槽用<template #name>定义,一个插槽一个模板,由于之前的代码header、title、chart都只设置了空插槽,而插槽footer中有设置默认插槽,并且涉及数据传递,因此父组件的数据直接传递到插槽footer中,此时footer插槽没有编写任何代码,页面会使用子组件中的默认插槽。可以自定义插槽name,通过条件插槽可以根据插槽是否存在来渲染某些内容,当我在父组件不想渲染这个插槽的时候,我直接不使用就可以不渲染(推荐使用)emits:['EvnentName']// 数组写法。
vue3基础之setup中的props自定义事件
weixin_64740434的博客
07-30 1684
使用setup中默认存在的defineEmits方法接受自定义事件我们在defineEmits的泛型中书写接口来接受自定义事件接口中每接收一个自定义事件,都是函数类型,参数固定第一个值event值是自定义事件名称,后边参数都是自定义事件接收的参数,这个函数类型返回值一般都是voiddefineEmits返回一个emit方法,方便我们调用自定义事件也可以在模板中直接使用 组件实例上的 $emit 调用。
setupexpose的用法
茶荼
11-29 1294
子组件:childrenFile.vue <template> <div>{{ count }}</div> </template> <script> import { ref } from 'vue' export default { setup (props, { expose }) { const count = ref(0) const increment = () => ++count.value
vue3 setup 组合式api props父子组件传值详解
dxh9231028的博客
06-26 7182
这样做可以直接使用data和data2,无需props.data,但有一个致命的缺陷,数据会失去响应式,所以结构时,需要用torefs包裹,因为props本质上时reactive对象,torefs可以把reactive的每个对象变成ref对象,这样结构出来依旧是响应式。细节方面(基本没用,感兴趣可以看看)========================================================================当父组件传给子组件是响应式对象,那么此数据是原数据的。
JavaScript源代码】Vue3中SetUp函数的参数props、context详解.docx
12-29
Vue3中的`setup`函数是Composition API的核心部分,它允许开发者在组件的生命周期早期定义状态、响应式属性方法。这个函数接收两个参数:`props`和`context`。 1. **props**: - `props`是一个对象,用于接收父...
setup()函数获取全局实例方法 & Vue组件的data域(this指向)
weixin_41387874的博客
03-09 3764
在Vue3的setup()函数获取全局实例方法 在Vue2中,我们可以通过this.$来获取全局实例方法 一个例子 this.$requestLogin() 这样就可以获取定义在main.js中的全局实例方法。 但是在Vue3中的setup函数中,由于不存在this,所以上面的方法是不行的 下面提供2种方法 使用getCurrentinstance() const instance = getCurrentInstance() instance.proxy.$requestL
vue组件获取props_vue组件之属性Props
weixin_32051661的博客
12-24 1585
组件的属性事件父子组件之间的通信父子组件之间的通信就是 props down,events up,父组件通过 属性props向下传递数据给子组件,子组件通过 事件events 给父组件发送消息。比如,子组件需要某个数据,就在内部定义一个prop属性,然后父组件就像给html元素指定特性值一样,把自己的data属性传递给子组件的这个属性。而当子组件内部发生了什么事情的时候,就通过自定义事件来把这个...
【Vue3】setupref函数、reactive函数
qiaoyangla的博客
06-28 734
1、理解:Vue3中的一个新的配置项,值为一个函数2、setup是所有Composition API(组合API)的“表演舞台”3、组件中所用到的数据、方法等等,都要配置到set up组件中4、setup函数的两种返回值5、注意点:1、尽量不要与VUE2.X配置混用2、setup不能是一个async函数,因为返回值不再是return的对象,而是promise,模板看不到return对象中的属性。举例: ref函数 作用:定义一个响应式的数据语法:const xxx =ref (initValue)备
vue3在 setup 中使用 props
m0_67403013的博客
03-09 1139
vue3在 setup 中使用 props 记录学习和开发中遇到的问题 之前我尝试在 setup 中使用 props 是这样的 export default defineComponent({ setup(props: any) { console.log(props.id) // 输出 undefined } }) 然而 却输出 undefined ,通过思考和查阅资料,与 vue2 做对比,少了 props 声明一步 加上声明就可以了 export default
【Vue3】setup通过defineProps获取props为null
qq_38196449的博客
05-08 515
其实原因很简单,defineProps只在setup语法糖中好使,也就是的方式
【vue3】vue3 setup如何使用props
热门推荐
qq_39576711的博客
03-18 6万+
setup是一个组件选项,在组件被创建之前,props 被解析之后执行。它是组合式 API 的入口。 他接受两个参数: {Data} props {SetupContext} context 在setup里边,第一个参数就是props,下面来看示例。 子组件propsTest.vue: <script lang="ts"> import { toRefs } from 'vue' interface Data { [key:string]:unknown } export defaul
vue3学习 setupprops,context
weixin_48789376的博客
07-28 8200
setup 函数 1、执行时机在 beforeCreate 和 created这两个钩子函数之前,是最早执行的,在程序运行中,setup函数只执行一次 2、在setup中没有this , 打印返回undefined vue3里的生命周期: ① 可以和vue2里一样选项式写法,和setup平级, beforeCreate/ created/ beforeMount/ mounted / beforeUpdate / updated / beforeUnmount / unmounted ② 可以在setup
vue中的setup函数返回
2201_75341058的博客
10-08 582
被用作组件的渲染。渲染函数返回了一个div,用于动态生成组件的内容。setup返回函数为。
vue3 setup 使用props
pjluoji的博客
01-24 624
为了方便下次开发使用,记录一下。
vue 在setup上使用async 并在组件上使用Suspense的案例展示
jjw_zyfx的博客
03-30 435
vue 在setup上使用async 并在组件上使用Suspense的案例展示
vue3 setup 如何获取 props
最新发布
09-25
在 Vue 3 中,使用 `setup()` 钩子编写组件时,你可以直接从 `this` 上访问 props。`this` 关联到当前组件实例,所以你可以像这样获取 props: ```vue <template> <div> <!-- 在模板中使用 props --> {{ message }} <!-- 可能还有其他元素,如按钮,根据 prop 更新内容 --> </div> </template> <script setup> import { ref, computed } from 'vue'; // 引入必要的依赖 // 假设我们有一个名为 "message" 的 prop const message = this.$props.message; // 直接从 this 访问 prop // 或者使用 computed 函数包装,确保只在需要时更新 const formattedMessage = computed(() => { return `你好,${message}`; }); </script> ``` 在上面的例子中,`$props` 对象包含了所有的传给组件的 props。注意,在 `setup` 中,你需要导入 `ref` 和 `computed` 或其他相关的库来处理可能的计算属性
写文章

热门文章

  • deque容器详解 13958
  • Oracle系统案例——学生信息管理系统 11623
  • Vue组件详解 11554
  • Vue的三种网络请求方式 10477
  • CSS溢出的文字省略号显示 7866

分类专栏

  • 设计模式 1篇
  • 数据库 1篇
  • python 2篇
  • Django 2篇
  • 爬虫 3篇
  • flask 3篇
  • Git 3篇
  • 有用的知识 1篇
  • 工作记录 4篇
  • JavaScript 6篇
  • RxJS 1篇
  • ts 1篇
  • Bulma 1篇
  • Vue 38篇
  • React 28篇
  • C++STL 8篇
  • JavaWeb 1篇
  • 微信小程序开发 4篇
  • UML 1篇
  • 计算机网络 51篇
  • 计算机操作系统 13篇
  • Oracle数据库 17篇
  • 前端Web 24篇
  • 软件设计师备考 17篇
  • Linux基础 6篇
  • JavaSE 56篇

最新评论

  • Vue插槽详解

    阳阳丶Sheep: 请教一个问题,大佬。 我有3个组件,app.vue、table.vue、column.vue column的内容是 <tempalte> <div class="column"> <slot name="default" :row=“2”></slot> </div> </template table的内容是 <template> <div class=“header”> <slot name="column"></slot> </div> <div class=“body”></div> </template> app的内容是 <template> <table> <template #column> <column> <template #default> <button>1</button> </template> </column> </template> </table> </template> 想请问下,我怎样才能把 app 里定义的 column 的插槽内容,显示在 table 的 class 为 body 的 div 里。就和 ui 组件库那样的,我看了 ui 组件库的逻辑,但是没弄明白。想请教下这块的办法

  • React18路由详解

    fengye_818: 写的真tmd 好

  • Java:对象未初始化、对象为null、对象的属性为null的区别

    宇1~: 当对象为空,对象可以引用类变量的值

  • C++STL:vector容器详解

    一枝野生荔枝儿: 打印遍历的函数,为什么使用引用&v

  • Java:对象未初始化、对象为null、对象的属性为null的区别

    想回幼儿园当学霸: 懂了表情包

大家在看

  • 程序员35岁何必苟且,打造一人企业开启创业之路 352
  • Python中的并发、并行与异步处理:简单入门指南
  • VNC安装步骤【#1024程序员节 | 征文#】
  • ubuntu22.04下Hadoop单机模式伪分布式安装过程【全网最详细】
  • 【Linux】进程间通信(匿名管道) 1863

最新文章

  • 设计模式大全
  • Flask中创建多线程和多进程
  • 数据库锁有哪些?什么是死锁?
2024年11篇
2023年11篇
2022年118篇
2021年153篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家四川动物玻璃钢雕塑生产厂家湖南水景玻璃钢彩绘雕塑公司中国玻璃钢造型雕塑玻璃钢景观雕塑定制价格雨花美陈商场品质玻璃钢人物雕塑生产黄圃玻璃钢雕塑官渡玻璃钢仿真雕塑越城玻璃钢造型雕塑广州玻璃钢花盆模具玻璃钢景观园林雕塑生产厂家云南玻璃钢仿铜雕塑定做价格梧州玻璃钢雕塑公司制造形象卡通游乐园玻璃钢雕塑无锡商场美陈玻璃钢卡通雕塑赤峰玻璃钢雕塑厂新疆玻璃钢雕塑生产厂家池州户外玻璃钢雕塑江门玻璃钢雕塑供应厂家上海秋季商场美陈采购甘肃雕塑玻璃钢临沧佛像玻璃钢雕塑海口玻璃钢雕塑厂家哪里好扬州玻璃钢人物雕塑福建佛像玻璃钢雕塑定做价格桥北商场主题美陈高架玻璃钢花盆价格安徽商场节庆美陈雕塑摆件定制玻璃钢人物大型城市雕塑制作江苏景观玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化