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

问题描述 投票:0回答:8

正如标题所说, 相关链接:

script setup
(不含参考糖)

<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>
javascript vue.js vuejs3 vue-composition-api vue-script-setup
8个回答
122
投票

要将 props 与

<script setup>
一起使用,您需要使用组件 prop 选项作为参数调用
defineProps()
,这定义了组件实例上的 props 并返回一个
reactive
对象,其中包含您可以使用的 props,如下所示:

<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>

如果您使用打字稿,则替代方法是传递仅类型声明并从中推断 prop 类型。优点是您将获得更严格的类型安全性但不能有默认值。

<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'
})

24
投票

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

CircleImage.vue

<template>
  <div class="px-4 w-8/12 sm:w-3/12">
    <img :src="src" :alt="alt" 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.vue

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

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

另请参阅文档:声明道具或附加选项


8
投票

我读了“New

script 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>

6
投票

无需显式调用

withDefaults

<script setup>
import { defineProps } from 'vue'

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

4
投票

编辑:这个答案已经过时了。 RFC 已更改为使用

defineProps(..)
,如果使用 SFC,则会自动导入。

根据正在进行的 RFC

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

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

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

这些参数与

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


2
投票

如果你需要你的 props 具有反应性,你可以将它们放入你的子组件中,如下所示:

const props = defineProps({
    no: String,
    myIdOfSomething: Number
})

const { no, myIdOfSomething } = toRefs(props);

console.log(no.value)
console.log(myIdOfSomething.value)

来源https://vuejs.org/api/sfc-script-setup.html#defineprops-defineemits


1
投票

使用 Typescript 你可以用两种语法定义你的 props :

  1. 第一个语法

<script setup lang="ts">
import {PropType} from 'vue'

const props=defineProps({
   color:{
      type:String as PropType<'primary'|'info'|'success'|'error'|'warning'>,
      default :'primary'
    }
})

</script>

  1. 第二种语法

<script setup lang="ts">

type Color='primary'|'info'|'success'|'error'|'warning'

const props=defineProps<{color:Color}>()

</script>

此语法仅支持:

  • 类型文字
  • 对同一文件中的接口或类型文字的引用

0
投票

如果您正在使用

Typescript
并且还想添加默认值,则可以使用此语法。

<script setup lang="ts">

interface Props {
 disabled: boolean;
 loading: boolean;
 bordered: boolean;
 label?: string;
}

const props = withDefaults(defineProps<Props>(), {
 label: "Button Label",
}); 
</script>
© www.soinside.com 2019 - 2024. All rights reserved.