// 父组件 <my-components :commonData='commonData' @changeCommonData='changeCommonData'></my-components> changeCommonData(data){ this.commonData = data } // my-components子组件中 doSome(){ this.$emit('changeCommonData',data) // data === 2,这时父组件中的commonData已经更改成2,可是子组件的响应,要等待当前函数执行完后响应 console.log(this.commonData) // 原始值是1, }
some-props
和someProps
的命名方式,外部均可以经过some-props
和someProps
赋值,在内部只能经过this.someProps
得到
<text-document v-bind:title.sync="doc.title"></text-document> // 实际为 <text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event" ></text-document> ... watch:{ title(newTitle){ this.$emit('update:title', newTitle) } } ...
props: { propA:{ type: Number, default: 100, // 对象或数组默认值必须从一个工厂函数获取 required: true, // 必传 validator: function (value) { // 自定义验证函数 // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } } }
function Person (firstName, lastName) { this.firstName = firstName this.lastName = lastName } Vue.component('blog-post', { props: { author: Person } }) // 类同于 propA: Number
Vue.component('my-component', { inheritAttrs: false, // ... })
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
v-bind=”{ title: doc.title }”
没法正常工做<blog-post v-bind="post"></blog-post> // 等价于 <blog-post v-bind:id="post.id" v-bind:title="post.title" ></blog-post>
对于须要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组合文字过程当中获得更新。若是你也想处理这个过程,请使用 input 事件。当用输入法时可以捕获输入的每一个拼音字母vue
<div id="example-5"> <select v-model="selected"> // selected 默认为'' <option disabled value="">请选择</option> <option>A</option> <option>B</option> <option>C</option> </select> <span>Selected: {{ selected }}</span> </div>
<input type="radio" id="huey" name="drone" value="huey" checked> // checked初始被选中
<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" >
<input type="checkbox" id="checkbox" v-model="checked">
选中时checked为true,不然为false。不须要value<div id='example-3'> <input type="checkbox" id="jack" value="Jack" v-model="checkedNames"> <label for="jack">Jack</label> <input type="checkbox" id="john" value="John" v-model="checkedNames"> <label for="john">John</label> </div> new Vue({ el: '#example-3', data: { checkedNames: [] //=>['Jack','John'] } })
// input中 <input v-model="searchText"> // 等价于 <input v-bind:value="searchText" v-on:input="searchText = $event.target.value" // 这里的$event是事件对象 > // 组件中 // 组件外部使用 <custom-input v-model="searchText"></custom-input> // 等价于 <custom-input v-bind:value="searchText" v-on:input="searchText = $event" ></custom-input> // 组件内部定义 Vue.component('custom-input', { props: ['value'], template: ` <input v-bind:value="value" v-on:input="$emit('input', $event.target.value)" // $event.target指向时间对象,input对象有value属性 > ` })
Vue.component('base-checkbox', { model: { prop: 'checked', event: 'change' }, <base-checkbox v-model="lovingVue"></base-checkbox> // 使用 v-model 的时候,这里的 lovingVue 的值将会传入这个名为 checked 的 prop。同时当 <base-checkbox> 触发一个 change 事件并附带一个新的值的时候,这个 lovingVue 的属性将会被更新。
// 组件 <ul> <li v-for="todo in todos" v-bind:key="todo.id" > <!-- 咱们为每一个 todo 准备了一个插槽,--> <!-- 将 `todo` 对象做为一个插槽的 prop 传入。--> <slot v-bind:todo="todo"> <!-- 回退的内容 --> {{ todo.text }} </slot> </li> </ul> // 使用(获取组件中传出的数据) <todo-list v-bind:todos="todos"> <!-- 将 `slotProps` 定义为插槽做用域的名字 --> <template slot-scope="slotProps"> // 这里可使用解构语法{ todo } <!-- 为待办项自定义一个模板,--> <!-- 经过 `slotProps` 定制每一个待办项。--> <span v-if="slotProps.todo.isComplete">✓</span> {{ slotProps.todo.text }} </template> </todo-list>
// 父级组件提供 'foo' var Provider = { provide: { // provide 选项应该是一个对象或返回一个对象的函数。 foo: 'bar' }, // ... } // 子组件注入 'foo' var Child = { inject: ['foo'], created () { console.log(this.foo) // => "bar" } // ... } // inject 选项应该是数组或对象(该对象的 key 是本地的绑定名,value 是搜索用的 key 或一个包含from和default属性的对象。(对象的from 属性是在可用的注入内容中搜索用的 key 、default 属性是降级状况下使用的 value)) inject:{ myFoo1:'foo', myFoo:{ from:'foo', default:'boy' // 与 prop 的默认值相似,你须要对非原始值(数组、对象)使用一个工厂方法 } }
// 组件1 import Bus from './Bus' export default { data() { return { ......... } }, methods: { .... Bus.$emit('log', 120) }, } // 组件2 import Bus from './Bus' export default { data() { return { ......... } }, mounted () { Bus.$on('log', content => { console.log(content) }); } }
import Vue from 'vue' const Bus = new Vue() var app= new Vue({ el:'#app', data:{ Bus } })