如何在 vue3 的 <script setup> 中使用 props

Posted

技术标签:

【中文标题】如何在 vue3 的 <script setup> 中使用 props【英文标题】:How to use props in <script setup> in vue3 【发布时间】:2021-05-28 15:01:42 【问题描述】:

喜欢标题, 关于链接: New script setup (without ref sugar)

<template>
  <TopNavbar title="room" />
  <div>
     no 
  </div>
</template>

<script setup>
import TopNavbar from '@/layout/TopNavbar.vue'
import  defineProps, reactive  from 'vue'

defineProps(
  no: String
)

const state = reactive(
  room: 
)

const init = async () => 
  // I want use props in this
  // const  data  = await getRoomByNo(props.no)
  // console.log(data);

init()

</script>

<style>
</style>

【问题讨论】:

【参考方案1】:

要使用带有&lt;script setup&gt; 的道具,您需要使用组件道具选项作为参数调用defineProps(),这将定义组件实例上的道具并返回带有道具的reactive 对象,您可以使用如下道具:

<template>
  <TopNavbar title="room" />
  <div>
     no 
  </div>
</template>

<script setup>
import TopNavbar from "@/layout/TopNavbar.vue";
import  defineProps, reactive  from "vue";

const props = defineProps(
  no: String,
);

const  no  = toRefs(props);

const state = reactive(
  room: ,
);

const init = async () => 
  const  data  = await getRoomByNo(no.value);
  console.log(data);
;

init();
</script>

如果您使用的是打字稿,另一种方法是传递仅类型声明并从中推断道具类型。优点是你会得到更严格的类型安全但你不能有默认值。

<template>
  <TopNavbar title="room" />
  <div>
     no 
  </div>
</template>

<script setup>
import TopNavbar from "@/layout/TopNavbar.vue";
import  defineProps, reactive  from "vue";

const props = defineProps<
  no: string,
>();

const  no  = toRefs(props);

const state = reactive(
  room: ,
);

const init = async () => 
  const  data  = await getRoomByNo(no.value);
  console.log(data);
;

init();
</script>

编辑

现在可以使用仅类型道具的默认值:

interface Props 
  msg?: string


const props = withDefaults(defineProps<Props>(), 
  msg: 'hello'
)

【讨论】:

【参考方案2】:

使用 Vue-3.1 及更高版本的功能非常简单的答案:

CircleImage.view

<template>
  <div class="px-4 w-8/12 sm:w-3/12">
    <img :src="src" : class="border-none rounded-full h-auto max-w-full align-middle" />
  </div>
</template>

<script setup>
const props = defineProps(
  src: String,
  alt: String,
)
</script>

MyView.view

<template>
  <div class="flex flex-wrap justify-center">
    <CircleImage src="/file1.jpg"  />
    <CircleImage src="/file2.svg"  />
  </div>
</template>

<script setup>
import CircleImage from '@/components/CircleImage.vue'
</script>

另请参阅文档:Declaring props or additional options

【讨论】:

【参考方案3】:

编辑:此答案已过时。 RFC 已更改为使用 defineProps(..),如果使用 SFC,则会自动导入。

根据ongoing RFC,setup 标签后面可以有一个字符串,您可以在其中定义您希望拥有的上下文,如下所示:

<script setup="props,  emit ">
import  watchEffect  from 'vue';

watchEffect(() => console.log(props.msg));
emit('foo');
</script>

这些与setup() 方法接收的参数相同。

【讨论】:

该 RFC 来自一个陈旧的分支并已被取代:PR - github.com/vuejs/rfcs/pull/227 Rendered - github.com/vuejs/rfcs/blob/master/active-rfcs/…【参考方案4】:

我阅读了“Newscript setup”并找到了答案

首先,使用变量保存defineProps

const props = defineProps(
  no: String
)

那就用吧

const init = async () => 
  console.log(props.no);


这是所有代码:

<template>
  <TopNavbar title="room" />
  <div>
     no 
  </div>
</template>

<script setup>
import TopNavbar from '@/layout/TopNavbar.vue'
import  defineProps, reactive, useContext  from 'vue'

const props = defineProps(
  no: String
)

const state = reactive(
  room: 
)

const init = async () => 
  console.log(props.no);

init()

</script>

<style>
</style>

【讨论】:

【参考方案5】:

无需显式调用withDefaults

<script setup>
import  defineProps  from 'vue'

defineProps(
  isOpen: 
    type: Boolean,
    default: true
  
)
</script>

【讨论】:

以上是关于如何在 vue3 的 <script setup> 中使用 props的主要内容,如果未能解决你的问题,请参考以下文章

vue3 <script setup> 写法

Vue3 使用 script-setup 语法糖

Vue3 使用 script-setup 语法糖

Vue3 使用 script-setup 语法糖

如何在 <script setup> 中注册组件?

vue3与vue2使用的一些对比