天下无坑

天下无坑


组件实现v-model双向绑定(value/input)

<h4>理解一</h4> <p>vue 再父子组件传值时,除了传统的父组件 :属性去传值外,还可以使用 父组件v-model传值,子组件props['value']接收, 而子组件也可以通过$emit('input',false),去改变父组件中v-model 和 子组件中 value 的值 。</p> <pre><code class="language-html">&lt;!--父组件--&gt; &lt;template&gt; &lt;test v-model = "isShow"&gt;&lt;/test&gt; &lt;button @click="isShow = !isShow"&gt;switch&lt;/button&gt; &lt;/template&gt; &lt;script&gt; import test from '../test'; export default { components: { test }, data() { return { isShow: false } } } &lt;/script&gt;</code></pre> <pre><code class="language-html">&lt;!--子组件--&gt; &lt;template&gt; &lt;div&gt; &lt;div&gt;{{value}}&lt;/div&gt; &lt;Button @click="$emit('input',false)"&gt;关闭&lt;/Button&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { props:['value'], mounted() { console.log(this.value) } } &lt;/script&gt;</code></pre> <h4>理解二</h4> <p>在父组件中有如下的定义</p> <pre><code class="language-html"> &lt;new-album v-model="isNewAlbum"&gt;&lt;/new-album&gt;</code></pre> <p>等同于下面的写法</p> <pre><code class="language-html"> &lt;new-album v-bind:value="isNewAlbum" v-on:input="isNewAlbum=$event"&gt;&lt;/new-album&gt;</code></pre> <p>在子组件中用下列写法接收</p> <pre><code class="language-html">props: { // value默认保存v-model的值 value: { type: Boolean } }, data() { return { show: this.value, }; }, ... watch: { value(val) { this.show = val; }, show(val) { if (!val) { // input事件默认改变props中value的值 this.$emit("input", false); } } },</code></pre> <p>input事件将false传递给父组件中用v-model绑定的isNewAlbum,即执行isNewAlbum=false</p>

页面列表

ITEM_HTML