的声明上缺少 partial 修饰符_.sync 修饰符和v-model

Vue props是单向绑定的,禁止在子组件中直接修改props,而应该通过$emit触发事件让父组件更新。Vue提供.sync修饰符简化监听事件的声明,实现props的双向绑定。示例展示了.sync修饰符的使用。
摘要由CSDN通过智能技术生成
.sync是一个语法糖。是父组件监听子组件更新某个props的请求的缩写语法。

Vue中的 props 是单向向下绑定的,即:每次父组件更新时,子组件中的所有 props 都会刷新为最新的值。但是如果在子组件中修改 props ,Vue会向你发出一个警告。(无法通过修改子组件的props来更改父组件。)

因此我们可以在父组件使用子组件的标签上声明一个监听事件,在子组件想要修改时使用$emit触发事件并传入新的值,让父组件进行修改。

Vue帮我们做了一个修饰符,简化我们声明监听事件的写法,即.sync 修饰符。

示例:

<template>
    <div class="details">
        <!-- <myComponent :show.sync='valueChild' style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent> -->
        <myComponent :show="valueChild" @update:show="valueChild = $event" style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent>
        <button @click="changeValue">toggle</button>
    </div>
</template>
<script>
import Vue from 'vue'
Vue.component('myComponent', {
      template: `<div v-if="show">
                    <p>默认初始值是{{show}},所以是显示的</p>
                    <button @click.stop="closeDiv">关闭</button>
                 </div>`,
      props:['show'],
      methods: {
        closeDiv() {
          this.$emit('update:show', false); //触发 input 事件,并传入新值
        }
      }
})
export default{
    data(){
        return{
            valueChild:true,
        }
    },
    methods:{
        changeValue(){
            this.valueChild = !this.valueChild
        }
    }
}
</script>
示例​codesandbox.io
6a71568cefd42aa12fa7c741a18b1894.png

示例来源:

深入理解vue 修饰符sync【 vue sync修饰符示例】​www.jianshu.com
a86de4291cf1ec9ca583d1a7e20a0783.png

v-model实现了双向绑定

以下是等同的

<input type="text" v-model="name">
//和
<input type="text" :value="name" @input="name=$event.target.value">

示例:

//APP.vue
<template>
  <div class="">
    <p>{{ name }}</p>
    <son v-model="name"></son>
    <!-- 等同于下面 -->
    <!-- <son type="text" :value="name" @input="name=$event"/> -->
  </div>
</template>

<script type="text/javascript">
import Son from "./components/son";
export default {
  name: "",
  data() {
    return {
      name: "sheben",
    };
  },
  components: {
    Son,
  },
};
</script>

//.components/son.vue
<template>
  <div class>
    <input
      type="text"
      :value="value"
      @input="$emit('input', $event.target.value)"
    />
  </div>
</template>

<script type="text/javascript">
export default {
  name: "",
  props: {
    value: {
      type: String,
      defalut() {
        return "";
      },
    },
  },
  data() {
    return {};
  },
  components: {},
};
</script>
示例​codesandbox.io
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值