Vue3+ts组件通讯(父传子,子传父)

Vue3+ts组件通讯(父传子,子传父)

Vue3+vite+ts+setup() {}的父子组件通讯里面包含了互相传值,传方法(里面有用到按钮vant组件,大家看需求换成自己的组件或者原生)

在这里插入图片描述

直接上代码-----父组件文件:Parentcomponent.vue

<!-- 父组件 -->
<template>
  <div class="iii">
    <div class="fu">父组件</div>
    <div class="ppp"><van-button type="primary" class="sss" @click="cssss()">调用子组件方法</van-button></div>
    <!-- 子组件 -->
    <Subcomponent @mingzi="fumingzi" @xiang="zuiooo" :message="messageFromParent" :form="From" :fun="fangfa" ref="funrrr"></Subcomponent>
  </div>
</template>

<script lang="ts">
import { ref, onBeforeMount, onMounted } from 'vue';
import Subcomponent from './subcomponent.vue';
export default {
  components: { Subcomponent },
  name: '',
  setup() {
    const messageFromParent = ref<string>('我是父组件传过来的值!');
    const From = ref<object>({
      name: '李雷',
      age: '刚满18岁',
    });
    const fangfa = () => {
      console.log('我是父组件的方法,被调用了');
    };
    // -----------------------------------------------------------------
    const fumingzi = (zhi: any) => {
      console.log('父组件接收到了:', zhi.value);
    };
    const zuiooo = (dui: any) => {
      console.log('父组件接收到了:', dui.value);
    };
    // ----------------------------------------------------
    const funrrr = <any>ref();
    const cssss = () => {
      funrrr.value.funsss();
      console.log('子组件的所有内容:', funrrr.value);
    };
    onBeforeMount(() => {});
    onMounted(() => {});
    return { fumingzi, zuiooo, messageFromParent, fangfa, cssss, funrrr, From };
  },
};
</script>
<style scoped lang="scss">
.fu {
  font-size: 16px;
  text-align: center;
  margin-bottom: 20px;
}
.iii {
  background-color: #ffa7a7;
}
</style>

子组件文件:subcomponent.vue

<!-- 子组件 -->
<template>
  <div class="fff">
    <div class="fu">子组件</div>
    <div class="fu colors">子传父</div>
    <div class="ppp"><van-button type="primary" class="sss" @click="dianji()">传给父组件单个值</van-button></div>
    <div class="ppp"><van-button type="primary" class="sss" @click="cuixiang()">传给父组件对象</van-button></div>
    <div class="ppp"><van-button type="primary" class="sss" @click="cpppp()">接收父组件的值</van-button></div>
    <div class="ppp"><van-button type="primary" class="sss" @click="cssss()">调用父组件方法</van-button></div>
    <div class="fu">{{ message }}</div>
  </div>
</template>

<script lang="ts">
import { ref, onBeforeMount, onMounted } from 'vue';

export default {
  name: '',
  props: {
    message: {
      type: String,
      required: true,
    },
    fun: {
      type: Function,
      required: true,
    },
    form: {
      type: Object,
      required: true,
    },
  },
  setup(props, context) {
    const zhi = ref<any>(666);
    const dui = ref<any>({
      name: '牛爱华',
      age: '刚满18岁',
    });
    const dianji = () => {
      context.emit('mingzi', zhi);
    };
    const cuixiang = () => {
      context.emit('xiang', dui);
    };
    // -------------------------------------------------------------
    const cpppp = () => {
      console.log(props.message);
    };
    const cssss = () => {
      if (typeof props.fun === 'function') {
        props.fun(); // 调用父组件传递的函数
      } else {
        console.error('fun is not a function');
      }
    };
    console.log('父传子:', props.form);
    // --------------------------------------------------------------------
    const funsss = () => {
      console.log('我是子组件的方法');
    };
    onBeforeMount(() => {});
    onMounted(() => {});
    return { dianji, cuixiang, cpppp, cssss, funsss };
  },
};
</script>
<style scoped lang="scss">
.fu {
  font-size: 16px;
  text-align: center;
  margin-bottom: 20px;
}
.colors {
  color: #eb8585;
}
.sss {
  margin: 0 auto;
}
.ppp {
  width: 375px;
  height: 80px;
}
.fff {
  background-color: #b5faff;
}
</style>

补充一点,如果是使用

这种语法糖的方式的话props是这样用的:

<script setup lang="ts">
const props = defineProps({
  message: String,
});
//使用
console.log(props.message);
</script>
Vue 3中,通过使用事件将数据从子组件传递给父组件。以下是在Vue 3和TypeScript中实现子传父的示例: 首先,在子组件中定义一个事件,通过`@emit`修饰符触发该事件,并将需要传递给父组件的数据作为参数进行传递: ```typescript // ChildComponent.vue <template> <button @click="onButtonClick">点击传递数据给父组件</button> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ emits: ['dataToParent'], // 定义一个名为"dataToParent"的事件 setup(_, { emit }) { const onButtonClick = () => { const data = 'Hello from child component'; emit('dataToParent', data); // 触发"dataToParent"事件,并传递数据给父组件 }; return { onButtonClick, }; }, }); </script> ``` 然后,在父组件中监听子组件触发的事件,并处理传递过来的数据: ```typescript // ParentComponent.vue <template> <div> <p>从子组件接收到的数据:{{ receivedData }}</p> <child-component @dataToParent="onDataReceived"></child-component> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ data() { return { receivedData: '', }; }, methods: { onDataReceived(data: string) { this.receivedData = data; // 处理从子组件传递过来的数据 }, }, }); </script> ``` 在父组件中,我们通过`@dataToParent`监听子组件触发的事件,并在`onDataReceived`方法中处理接收到的数据。这样,子组件就可以将数据传递给父组件了。 请注意,上述示例是在Vue 3和TypeScript环境下实现子传父的一种方式。你也可以使用其他方式来实现,例如使用Provide/Inject或Vuex等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值