- Options API vue2 的方式
- Composition API vue3 的方式
- Script Setup vue3 更精简的方式
| <script lang="ts"> |
| import { defineComponent } from "vue"; |
| |
| export default defineComponent({ |
| name: "App", |
| data() { |
| return { name: "Erik" }; |
| } |
| |
| |
| |
| |
| |
| }); |
| </script> |
| |
| <template> |
| <h3>Hello World</h3> |
| <h5>{{ name }}</h5> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
| <script lang="ts"> |
| import { defineComponent } from "vue"; |
| |
| export default defineComponent({ |
| name: "App", |
| setup() { |
| let name = "erik"; |
| return { name }; |
| } |
| }); |
| </script> |
| |
| <template> |
| <h3>Hello World</h3> |
| <h5>{{ name }}</h5> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
| <script lang="ts" setup> |
| let name = "bob123"; |
| </script> |
| |
| <template> |
| <h3>Hello World</h3> |
| <h5>{{ name }}</h5> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
引用一个组件
| <script lang="ts" setup> |
| import HelloWorld from "./components/HellowWorld.vue"; |
| let name = "bob123"; |
| </script> |
| |
| <template> |
| <h3>Hello World</h3> |
| <h5>{{ name }}</h5> |
| <HelloWorld /> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
HelloWorld.vue
| <template> |
| <h3>Hello From Component</h3> |
| <h5>Received name: {{ props.name }}</h5> |
| </template> |
| |
| <script lange="ts" setup> |
| const props = defineProps({ name: String }); |
| </script> |
传递属性到子组件
| <script lang="ts" setup> |
| import HelloWorld from "./components/HellowWorld.vue"; |
| let name = "Erik"; |
| </script> |
| |
| <template> |
| <HelloWorld :name="name" /> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
HelloWorld.vue 默认属性值
| <template> |
| <h3>Hello From Component</h3> |
| <h5>Received name: {{ props.name }}</h5> |
| </template> |
| |
| <script lange="ts" setup> |
| const props = withDefaults(defineProps<{ name?: string }>(), { |
| name: "Stewart" |
| }); |
| </script> |
HelloWorld.vue 默认属性值, 定义接口的方式
| <template> |
| <h3>Hello From Component</h3> |
| <h5>Received name: {{ props.name }}</h5> |
| </template> |
| |
| <script lange="ts" setup> |
| interface props { |
| name?: string; |
| } |
| const props = withDefaults(defineProps<props>(), { |
| name: "Stewart" |
| }); |
| </script> |
响应子组件事件
| <script lang="ts" setup> |
| import HelloWorld from "./components/HellowWorld.vue"; |
| let name = "bob123"; |
| |
| function pressed() { |
| alert("Hello From Pressed Function"); |
| } |
| </script> |
| |
| <template> |
| <HelloWorld :name="name" @pressed="pressed" /> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
HelloWorld.vue 添加触发事件
| <template> |
| <h3>Hello From Component</h3> |
| <h5>Received name: {{ props.name }}</h5> |
| <button @click="getAlert">Press Me</button> |
| </template> |
| |
| <script lange="ts" setup> |
| |
| const emits = defineEmits(["pressed"]); |
| |
| function getAlert() { |
| emits("pressed"); |
| } |
| |
| interface props { |
| name?: string; |
| } |
| const props = withDefaults(defineProps<props>(), { |
| name: "Stewart" |
| }); |
| </script> |
响应子组件事件传递的参数
| <script lang="ts" setup> |
| import HelloWorld from "./components/HellowWorld.vue"; |
| let name = "bob123"; |
| |
| function pressed(info: string) { |
| alert("Hello From Pressed Function " + info); |
| } |
| </script> |
| |
| <template> |
| <HelloWorld :name="name" @pressed="pressed" /> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |
HelloWorld.vue 添加触发事件, 并传递参数
| <template> |
| <h3>Hello From Component</h3> |
| <h5>Received name: {{ props.name }}</h5> |
| <button @click="getAlert">Press Me</button> |
| </template> |
| |
| <script lange="ts" setup> |
| |
| const emits = defineEmits(["pressed"]); |
| |
| function getAlert() { |
| emits("pressed", "Whatever Test"); |
| } |
| |
| interface props { |
| name?: string; |
| } |
| const props = withDefaults(defineProps<props>(), { |
| name: "Stewart" |
| }); |
| </script> |
添加反应式变量
| <script lang="ts" setup> |
| import HelloWorld from "./components/HellowWorld.vue"; |
| import { ref } from "vue"; |
| |
| let name = "bob123"; |
| let pokemon = ref(null) as any; |
| |
| async function pressed() { |
| const info = await fetch("https://pokeapi.co/api/v2/pokemon/ditto"); |
| const json = await info.json(); |
| pokemon.value = json; |
| console.log(pokemon.value); |
| } |
| </script> |
| |
| <template> |
| <HelloWorld :name="name" @pressed="pressed" /> |
| <div v-if="pokemon"> |
| <img :src="pokemon.sprites.back_default" alt="" /> |
| </div> |
| </template> |
| |
| <style> |
| #app { |
| text-align: center; |
| color: #2c3e50; |
| margin-top: 60px; |
| } |
| </style> |