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

mor*_*ant 12 javascript vue.js vuejs3 vue-script-setup

喜欢标题,关于链接: 新的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>
Run Code Online (Sandbox Code Playgroud)

oli*_*bre 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*ard 13

要使用道具,<script setup>您需要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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

编辑

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

interface Props {
  msg?: string
}

const props = withDefaults(defineProps<Props>(), {
  msg: 'hello'
})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,仅当您想要解构(或“拆分”)道具以将单个道具作为 ref 传递给组合函数时才需要“toRefs”。其他情况直接使用`props.propName`即可 (6认同)
  • 仅供参考:我还需要从 vue 导入“toRefs” (2认同)

mor*_*ant 7

我读了《新script setup》并找到了答案

首先,使用变量保存defineProps

const props = defineProps({
  no: String
})
Run Code Online (Sandbox Code Playgroud)

然后使用它

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

Run Code Online (Sandbox Code Playgroud)

这是全部代码:

<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>
Run Code Online (Sandbox Code Playgroud)


ctw*_*ome 6

无需显式调用withDefaults

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

defineProps({
  isOpen: {
    type: Boolean,
    default: true
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)