组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件

这篇具有很好参考价值的文章主要介绍了组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用watch监听

父组件使用.sync进行数据的绑定 传值子组件时 把值赋值到data的变量中 然后监听该数据的变化 $emit抛出

父组件demo
<template>
  <div>
    <Son :model-value.sync="modelValue" :select-value.sync="selectValue" />
  </div>
</template>

<script>
import Son from './son.vue'
export default {
  name: 'Father',
  components: {
    Son
  },
  props: {

  },
  data() {
    return {
      modelValue: '789',
      selectValue: '1'
    }
  }

}
</script>

<style lang="scss" scoped>

</style>
子组件
<template>
  <div>
    <div style="margin-top: 15px;width: 600px;">
      <el-input v-model="sonInputValue" placeholder="请输入内容" class="input-with-select">
        <el-select slot="prepend" v-model="sonSelectValue" placeholder="请选择" style="width: 100px;">
          <el-option label="餐厅名" value="1" />
          <el-option label="订单号" value="2" />
          <el-option label="用户电话" value="3" />
        </el-select>
        <el-button slot="append" icon="el-icon-search" />
      </el-input>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Son',
  // 父组件传递过来的值
  props: {
    modelValue: {
      type: String,
      default: ''
    },
    selectValue: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      // 子组件绑定的值
      sonInputValue: this.modelValue,
      sonSelectValue: this.selectValue
    }
  },
  watch: {
    // 当子组件绑定的值发生变化时 抛给父组件
    sonInputValue() {
      this.$emit('update:modelValue', this.sonInputValue)
    },
    sonSelectValue() {
      this.$emit('update:selectValue', this.sonInputValue)
    }
  }
}
</script>

<style lang="scss" scoped>

</style>

展示效果

组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件
组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件
组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件

使用绑定对象的方式打破单向数据流实现

父组件
<template>
  <div>
    <Son :model-value.sync="modelValue" />
  </div>
</template>

<script>
import Son from './son.vue'
export default {
  name: 'Father',
  components: {
    Son
  },
  props: {

  },
  data() {
    return {
      modelValue: {
        keyword: '',
        placeholder: '请输入你查询的关键字',
        options: [
          { label: '视频', value: 'video' },
          { label: '文章', value: 'article' },
          { label: '用户', value: 'user' }
        ],
        selectValue: 'video'
      }
    }
  }

}
</script>

<style lang="scss" scoped>

</style>

子组件
<template>
  <div>
    <div style="margin-top: 15px;width: 600px;">
      <el-input v-model="modelValue.keyword" :placeholder="modelValue.placeholder" class="input-with-select">
        <el-select slot="prepend" v-model="modelValue.selectValue" placeholder="请选择" style="width: 100px;">
          <el-option
            v-for="item in modelValue.options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
        <el-button slot="append" icon="el-icon-search" />
      </el-input>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Son',
  // 父组件传递过来的值
  props: {
    modelValue: {
      type: Object,
      default: () => { },
      require: true
    }
  },
  data() {
    return {

    }
  },
  watch: {

  }
}
</script>

<style lang="scss" scoped>

</style>

参考vue官方及各插件库的方案 使用计算属性来保证双向数据流

通过计算属性 修改父组件中的值 让父组件的值发生变化 在去改变子组件的值
组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件文章来源地址https://www.toymoban.com/news/detail-418390.html

父组件
<template>
  <div>
    <Son :model-value.sync="modelValue" />
  </div>
</template>

<script>
import Son from './son.vue'
export default {
  name: 'Father',
  components: {
    Son
  },
  props: {

  },
  data() {
    return {
      modelValue: {
        keyword: '',
        placeholder: '请输入你查询的关键字',
        options: [
          { label: '视频', value: 'video' },
          { label: '文章', value: 'article' },
          { label: '用户', value: 'user' }
        ],
        selectValue: 'video'
      }
    }
  }

}
</script>

<style lang="scss" scoped>

</style>
子组件
<template>
  <div>
    <div style="margin-top: 15px;width: 600px;">
      <el-input v-model="model.keyword" :placeholder="model.placeholder" class="input-with-select">
        <el-select slot="prepend" v-model="model.selectValue" placeholder="请选择" style="width: 100px;">
          <el-option
            v-for="item in model.options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
        <el-button slot="append" icon="el-icon-search" />
      </el-input>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Son',
  // 父组件传递过来的值
  props: {
    modelValue: {
      type: Object,
      default: () => { },
      require: true
    }
  },
  data() {
    return {

    }
  },
  computed: {
    model: {
      get() {
        const _this = this
        return new Proxy(this.modelValue, {
          set(obj, name, val) {
            _this.$emit('update:modelValue', {
              ...obj,
              [name]: val
            })
            return true
          }
        })
      },
      set(val) {
        this.$emit('update:modelValue', val)
      }
    }
  },
  watch: {

  }
}
</script>

<style lang="scss" scoped>

</style>

到了这里,关于组件封装v-model .sync在父子组件中实现双向数据绑定 如何处理单向数据流 封装表单组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 组件v-model(.sync)记录使用(vue3)

    首先,让我们来了解一下Vue3中v-model的用法。在Vue3中, v-model 指令可以用于自定义组件上,用于实现组件的双向数据绑定。与Vue2中的 .sync 不同, Vue3中的v-model需要在组件中手动实现双向绑定逻辑。 下面是一个简单的父组件示例,展示了如何在Vue3中使用 v-model 来实现组件的双

    2024年01月19日
    浏览(44)
  • vue父子组件传值(v-model)

    子组件使用 props 接收父组件传来的值 1)这里有个大坑, el-dialog 中一定要用 model-value 来代替 v-model ,不能用 v-model ,否则会报错 (2)子组件中修改父组件传入的参数 visible 时,使用 👇方式

    2024年02月11日
    浏览(42)
  • 在vue2使用v-model对组件进行双向绑定

    v-model=“visible” 等价于 :value=“visible” 加上 @input=“visible = $event” 所以 v-model 就是父组件向子组件传了个 value 字段的值,子组件使用 props 定义 value 字段, 就可以在子组件使用 value 读取这个值;子组件使用 $emit(‘input’,值) 就可以改变 v-model 的值 父组件 子组件 父组件 子

    2024年02月10日
    浏览(42)
  • Vue-Element-Admin项目学习笔记(9)表单组件封装,父子组件双向通信

    前情回顾: vue-element-admin项目学习笔记(1)安装、配置、启动项目 vue-element-admin项目学习笔记(2)main.js 文件分析 vue-element-admin项目学习笔记(3)路由分析一:静态路由 vue-element-admin项目学习笔记(4)路由分析二:动态路由及permission.js vue-element-admin项目学习笔记(5)路由分析

    2024年02月11日
    浏览(55)
  • uni-app 使用v-model封装picker组件和自定义样式

    1、v-model封装picker组件 (1)封装组件myPicker.vue (2)组件调用 (3)属性说明 属性名 类型 默认值 说明 options Object 数据选项,默认[{ name: \\\"办公\\\", value: \\\"1\\\" }]格式 rangeKey String label 数据选项的属性名 rangeValue String value 数据选项的属性值 placeholoder String 请选择 未选择数据时的默认

    2024年02月09日
    浏览(54)
  • Vue父子组件间数据的双向绑定

    在vue中数据的流向通常是单向的,但是实际开发中,存在子组件对父组件值进行更新的情况,例如对表单组件进行二次封装等,父组件需要响应子组件的变化。双向绑定呼之欲出,vue提供了两种方法进行双向绑定: 在父组件上 v-model 会利用子组件名为 value 的 prop 和名为 inp

    2024年02月06日
    浏览(56)
  • 【Vue】双向绑定 v-model

    2024年01月22日
    浏览(42)
  • vue父子组件之间双向数据绑定的(vue2/vue3)

    vue父子组件之间双向数据绑定的四种方法(vue2/vue3) vue考虑到组件的可维护性,是不允许子组件改变父组件传的props值的。父组件通过绑定属性的方式向子组件传值,而在子组件中可以通过$emit向父组件通信(第一种方式),通过这种间接的方式改变父组件的data,从而实现子组

    2024年02月08日
    浏览(76)
  • vue3 antd项目实战——Form表单的提交与校验【v-model双向绑定input输入框、form表单数据,动态校验规则】

    本文依旧沿用 ant design vue 组件库和 ts 语言🔥🔥更多内容见Ant Design Vue官方文档 🔥🔥 vue3 antd项目实战——Form表单【后台管理系统 v-model数据的双向绑定,input输入框、Radio单选框的嵌套使用】 在上期文章中,我们完成了 UI界面的渲染 (渲染效果如下图),本期文章将带着大

    2023年04月22日
    浏览(86)
  • vue3 antd项目实战——radiogroup单选组合、radiobutton单选按钮【v-model双向绑定数据、v-for循环输出options选择项】

    🔥🔥更多内容见Ant Design Vue官方文档 🔥🔥 vue3+ant design vue+ts实战【ant-design-vue组件库引入】 🔥vue3【列表渲染】v-for 详细介绍(vue中的“循环”) 最近在项目开发中需要使用到 ant design vue 组件库的 单选框(Radio)组件 。所以本期文章会详细地教大家 如何使用Radio单选框 。

    2024年02月16日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包