子组件和父组件数据双向绑定


前言

  • 在vue2中
    v-model实际上是表单的 :value属性 和@input事件的合写,是一个语法糖
  • 在vue3中
    v-model实际上是表单的 :modelValue属性 和@update:modelValue事件的合写,是一个语法糖

Vue2

一、表单类组件

1.简写

在子组件身上使用v-model绑定数据

<BaseSelect v-model="selectId"></BaseSelect>
<script>
import BaseSelect from './components/BaseSelect.vue'
export default {
  data() {
    return {
      selectId: '101',
    }
  },
  components: {
    BaseSelect,
  },
}
</script>

子组件

使用props接收父组件传递过来的value参数
并使用$emit发送input事件给父组件

	<select :value="value" @change="changeCity">
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
    <script>
export default {
  props: {
    value: {
      type: String
    }
  },
  methods: {
    changeCity(e) {
      this.$emit('input', e.target.value)
    },
  }
}
</script>

2.完整写法

在子组件身上使用:value绑定数据,@自定义事件名处理参数

<BaseSelect :value="selectId" @handleChange='selectId=$event'></BaseSelect>
<script>
import BaseSelect from './components/BaseSelect.vue'
export default {
  data() {
    return {
      selectId: '101',
    }
  },
  components: {
    BaseSelect,
  },
}
</script>

子组件

使用props接收父组件传递过来的value参数
并使用$emit发送自定义事件给父组件

	<select :value="value" @change="changeCity">
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
    <script>
export default {
  props: {
    value: {
      type: String
    }
  },
  methods: {
changeCity(e){
      this.$emit('handleChange',e.target.value)
    }
  }
}
</script>

二、非表单类组件

绑定数据时使用.sync修饰符

作用:可以实现 子组件 与 父组件数据 的 双向绑定,简化代码
特点:props属性名,可以自定义,非固定为 value
场景:封装弹框类的基础组件, visible属性 true显示 false隐藏
本质:就是 :属性名 和 @update:属性名 合写

1.简写

<button @click='open'>退出按钮</button>
    <BaseDialog :isShow.sync="isShow"></BaseDialog>
<script>
import BaseDialog from "./components/BaseDialog.vue"
export default {
  data() {
    return {
      isShow: false
    }
  },
  components: {
    BaseDialog,
  },
  methods: {
    open() {
      this.isShow = true
    }
  }
}
</script>

子组件

使用props接收父组件传递过来的参数
$emit发送固定事件名update:props接收过来的参数


    <div class="base-dialog"  v-show="isShow">
      <div class="title">
        <h3>温馨提示:</h3>
        <button class="close" @click="closeDialog">x</button>
      </div>
    </div>
<script>
export default {
  props: {
    isShow: Boolean,
  },
  methods: {
    closeDialog() {
      this.$emit('update:isShow', false)
    }
  }
}
</script>

2.完整写法

<button @click='open'>退出按钮</button>
    <BaseDialog :flag.sync="isShow"
    @update:flag='isShow=$event'></BaseDialog>
<script>
import BaseDialog from "./components/BaseDialog.vue"
export default {
  data() {
    return {
      isShow: false
    }
  },
  components: {
    BaseDialog,
  },
    methods: {
    open() {
      this.isShow = true
    }
  }
}
</script>

子组件

使用props接收父组件传递过来的参数
$emit发送固定事件名update:props接收过来的参数


    <div class="base-dialog"  v-show="flag">
      <div class="title">
        <h3>温馨提示:</h3>
        <button class="close" @click="closeDialog">x</button>
      </div>
    </div>
<script>
export default {
  props: {
    flag: Boolean,
  },
  methods: {
    closeDialog() {
      this.$emit('update:flag', false)
    }
  }
}
</script>

Vue3

1.简写

父组件使用v-model

<channel-select v-model="params.cate_id"></channel-select>

子组件使用defineProps接收数据和defineEmits发送数据

<script setup>
// 接收父组件传递过来的参数
defineProps({
  modelValue: {
    type: [Number, String]
  }
})
// 子向父传递的参数
const emit = defineEmits(['update:modelValue'])
</script>
<template>
  <el-select :modelValue="modelValue" @update:modelValue="emit('update:modelValue', $event)" >
    <el-option
      v-for="item in channelList"
      :label="item.cate_name"
      :value="item.id"
      :key="item.id"
    ></el-option>
  </el-select>
</template>

2.完整写法

父组件使用 :modelValue 和 @update:modelValue

<channel-select
          :modelValue="params.cate_id"
          @update:modelValue="params.cate_id = $event"
        ></channel-select>

子组件通过defineProps接收数据和defineEmits发送数据

<script setup>
// 接收父组件传递过来的参数
defineProps({
  modelValue: {
    type: [Number, String]
  }
})
// 子向父传递的参数
const emit = defineEmits(['update:modelValue'])
const changeHandel = (e) => {
  console.log(e)
  emit('update:modelValue', e)
}
</script>
<template>
  <el-select :modelValue="modelValue" @change="changeHandel">
    <el-option
      v-for="item in channelList"
      :label="item.cate_name"
      :value="item.id"
      :key="item.id"
    ></el-option>
  </el-select>
</template>

可以自定义参数

父组件使用v-model

<channel-select v-model:cid="params.cate_id"></channel-select>

子组件使用defineProps接收数据和defineEmits发送数据

<script setup>
// 接收父组件传递过来的参数
defineProps({
  cid: {
    type: [Number, String]
  }
})
// 子向父传递的参数
const emit = defineEmits(['update:cid'])
</script>
<template>
  <el-select :modelValue="cid" @update:modelValue="emit('update:cid', $event)" >
    <el-option
      v-for="item in channelList"
      :label="item.cate_name"
      :value="item.id"
      :key="item.id"
    ></el-option>
  </el-select>
</template>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 React 中,组件组件传递数据是通过 props 来实现的,而组件组件传递数据通常是通过回调函数来实现的。 要实现组件组件传递数据双向绑定,可以通过以下步骤实现: 1. 在组件中定义一个状态变量,并将其作为 props 传递给组件。 2. 在组件中,通过 props 获取传递过来的数据,并将其保存在组件的状态变量中。 3. 在组件中,通过事件处理函数修改组件状态变量的值。 4. 在组件中定义一个回调函数,将修改后的值通过该回调函数传递给组件。 5. 在组件中,接收组件传递过来的值,并更新组件的状态。 这样,当组件的状态变量发生改变时,会触发回调函数将最新的值传递给组件,实现了双向数据绑定。 以下是一个示例代码: ```jsx // 组件 import React, { useState } from 'react'; import ChildComponent from './ChildComponent'; function ParentComponent() { const [data, setData] = useState(''); const handleDataChange = (newData) => { setData(newData); }; return ( <div> <ChildComponent data={data} onDataChange={handleDataChange} /> </div> ); } export default ParentComponent; // 组件 import React, { useState } from 'react'; function ChildComponent({ data, onDataChange }) { const [inputValue, setInputValue] = useState(''); const handleInputChange = (e) => { setInputValue(e.target.value); }; const handleButtonClick = () => { onDataChange(inputValue); }; return ( <div> <input type="text" value={inputValue} onChange={handleInputChange} /> <button onClick={handleButtonClick}>传递数据组件</button> </div> ); } export default ChildComponent;``` 在上面的示例中,组件 `ParentComponent` 定义了一个状态变量 `data`,并将其作为 props 传递给组件 `ChildComponent`。组件中,通过 `props` 获取 `data` 的值,并将其保存在组件的状态变量 `inputValue` 中。当组件输入框的值改变时,会触发 `handleInputChange` 来更新 `inputValue` 的值。当按钮被点击时,会调用 `handleButtonClick` 来触发回调函数 `onDataChange`,将最新的值传递给组件进行更新。这样就实现了组件组件传递数据双向绑定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值