vue3 setup的参数跟使用

本文详细介绍了Vue.js中子组件如何接收父组件传递的数据及事件,包括props、context的使用方法,以及如何触发自定义事件实现父子组件间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  setup() 接受二个参数 :props、context(有三个值)

  props:父组件传进来,并且声明(声明示例下方代码有标注)过的值

  context:1.attrs  外部传进来 但是没有声明过的值;

                  2.slots 通过插槽传进来的内容(下方代码没有验证,感兴趣的可以自己试一试);

                  3.emit  分发自定义事件。

首先写一个子组件的demo

<template>
  <h1 @click="hello2">{{ info.age }}</h1>
  <h1 @click="hello">{{ info.obj.sex }}</h1>
  <h1 @click="addGirl">女孩:{{ info.likeGirl }}</h1>
  <h1 @click="hello2">{{ age }}</h1>
  <button @click="text">点击触发父组件的自定义事件‘hello’</button>
</template>

<script>
import { reactive } from "vue";
export default {
  name: "Demo",
//声明外部传入的值
  props:['msg','school'],
声明外部的事件
  emits:['hello'],
  setup(props,context) {
    console.log(props)
    /*         let name = ref("小蜜瓜");
    let age = ref(12);
    let obj = reactive({
      name:'南瓜',
      sex:'女'
    })
    let likeGirl = reactive(['倪妮','刘浩存'])
    function hello2() {
     age.value = 13
     console.log(obj)
     obj.sex = '不详'
     likeGirl[0]='孙'
    } */
    function text(){
      context.emit('hello','我收到了')
    }
    function addGirl() {
      info.likeGirl.push("倪妮");
    }
    let hello = () => {
      alert(`我是${info.name}`);
    };
    let info = reactive({
      name: "小蜜瓜",
      likeGirl: ["宋佳", "刘浩存"],
      age: 12,
      obj: {
        name: "南瓜",
        sex: "女",
      },
    });
    return {
      info,
      addGirl,
      hello,
      text
    };
  },
};
</script>

<style>
</style>

将子组件引入父组件

<template>
  <Demo msg="我得" school="二中" @hello="dialogOne"/>
</template>

<script>
// import { reactive } from "vue";
import Demo from './commponents/test.vue'
export default {
  components: { Demo },
  name: "App",
  setup(){
    function dialogOne(val){
      alert (`我是小艾,${val}`)
    };
    return{
      dialogOne
    }
  }
};
</script>

<style>
</style>

### Vue 3 Setup 中 Computed 属性的用法 在 Vue 3 的 `setup` 方法中,`computed` 是一种用于定义计算属性的方式。它通过接收一个函数作为参数来实现只读的计算属性,或者通过接收一个对象(包含 `get` 和 `set` 方法)来实现可写的计算属性。 #### 只读计算属性 当只需要定义一个基于其他响应式数据的派生值时,可以使用简单的 getter 函数形式。这种情况下,`computed` 返回的是一个不可变的响应式引用对象。 ```javascript import { computed, reactive } from &#39;vue&#39;; export default { name: &#39;App&#39;, setup() { const state = reactive({ firstName: &#39;John&#39;, lastName: &#39;Doe&#39; }); // 定义只读计算属性 const fullName = computed(() => `${state.firstName} ${state.lastName}`); return { state, fullName }; } }; ``` 在此示例中,`fullName` 是由 `firstName` 和 `lastName` 组成的派生值[^2]。每当 `firstName` 或 `lastName` 发生变化时,`fullName` 将自动更新并反映最新的状态。 --- #### 可写计算属性 如果需要让计算属性能够被外部修改,则可以通过提供带有 `get` 和 `set` 方法的对象来创建可写的计算属性。 ```javascript import { computed, reactive } from &#39;vue&#39;; export default { name: &#39;App&#39;, setup() { const state = reactive({ firstName: &#39;John&#39;, lastName: &#39;Doe&#39; }); // 定义可写计算属性 const fullName = computed({ get: () => `${state.firstName} ${state.lastName}`, set: (newValue) => { const names = newValue.split(&#39; &#39;); state.firstName = names[0]; state.lastName = names[1]; } }); return { state, fullName }; } }; ``` 在这个例子中,`fullName` 不仅可以根据 `firstName` 和 `lastName` 自动生成,还可以通过设置新的字符串值来反向影响原始的数据源 `firstName` 和 `lastName`[^5]。 --- #### 缓存机制 需要注意的是,`computed` 属性会缓存其结果,并且只有在其依赖项发生改变时才会重新求值。这意味着即使多次访问同一个计算属性,在它的依赖未发生变化的情况下也不会重复执行计算逻辑[^4]。 --- #### 实际应用场景 假设有一个购物车功能,其中需要动态显示商品总价格: ```javascript import { computed, reactive } from &#39;vue&#39;; export default { name: &#39;ShoppingCart&#39;, setup() { const cartItems = reactive([ { id: 1, price: 10, quantity: 2 }, { id: 2, price: 20, quantity: 1 } ]); // 计算购物车总价 const totalPrice = computed(() => cartItems.reduce((total, item) => total + item.price * item.quantity, 0) ); return { cartItems, totalPrice }; } }; ``` 此代码片段展示了如何利用 `computed` 来简化复杂业务逻辑的同时保持性能优化[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值