能够用 v-model 指令在表单 <input>、<textarea> 及 <select> 元素上建立双向数据绑定。css
详细用法参见官方文档:https://cn.vuejs.org/v2/guide/forms.htmlhtml
<div id="app"> {{ msg }} </div> <script> // 若是仅仅是实例化vue对象中 既有el 又有template, // 若是template中定义了模板的内容 那么template模板的优先级大于el new Vue({ el: '#app', data() { return { msg:'alex' } }, template: ` <div class="app"> // 经过控制台可看到显示了template中定义的div <h2>{{ msg }}</h2> </div> ` }) </script>
<div id="app"> <App></App> </div> <script> // 声明一个组件 至关于自定义一个标签 所以名字首字母要大写 跟已有标签区分 // 局部组件 除了没有el属性 其余属性都与根组件(Vue实例化对象)同样 // 另外 组件中的data必定是一个函数 且必须有返回值 // 1、声明子组件 let App = { data(){ return { text:"我是局部组件App" } }, // 当前组件template中的标签与该组件的属性有关,跟其余组件无关 // 子组件的template必定要写 根组件(有el属性)的template能够不写 用el // 组件的template中必定要用一个标签包含,也能够给他挂载子组件,并使用 template:` <div> <h2>{{ text }}</h2> </div> ` }; new Vue({ el: '#app', data() { return { msg:'alex' } }, // 3、template中使用子组件 也能够不定义template属性 直接在el中使用 // 以标签的形式 如<App />或者<App></App> template: ` <div class="app"> <App /> </div> `, // 属性components用来挂载子组件 components:{ // 2、挂载子组件App(能够挂载多个子组件 用逗号隔开依次书写便可) App // 至关于App:App 若是键值同样,能够只写一个 } }) </script>
总结:vue
1)一个子组件挂载到哪一个组件,这个组件就是个人父组件;app
2)之后模块化开发时,一个组件就是一个文件(一个组件包含了html,css,js),想使用这个组件时导入便可使用ide
<div id="app"> <!-- 使用局部组件App和Vheader --> <App></App> <Vheader></Vheader> </div> <script> // 使用component方法 声明一个全局组件 全局组件不须要挂载 任一组件可以使用 // 第一参数是组件的名字 第二个参数是options Vue.component('VBtn',{ data(){ return { } }, template:` <button>按钮</button> ` }); // 声明一个局部组件Vheader let Vheader = { data(){ return { text:"我是局部组件Vheader" } }, // 使用全局组件VBtn template:` <div class="vheader"> <h2>{{ text }}</h2> <VBtn></VBtn> </div> ` }; // 声明一个局部组件 let App = { data(){ return { text:"我是局部组件App" } }, // 使用全局组件VBtn template:` <div class="app"> <h2>{{ text }}</h2> <VBtn></VBtn> </div> ` }; new Vue({ el: '#app', data() { return { } }, components:{ App, // 挂载局部组件App Vheader // 挂载局部组件Vheader } }) </script>
补充:使用vue内置组件slot分发内容从而自定义按钮的值,代码修改以下:模块化
Vue.component('VBtn',{ data(){ return { } }, template:` <button><slot></slot></button> ` }); // 声明一个局部组件Vheader let Vheader = { data(){ return { text:"我是局部组件Vheader" } }, // 使用全局组件VBtn template:` <div class="vheader"> <h2>{{ text }}</h2> <VBtn>登陆</VBtn> </div> ` };
<div id="app"> <App></App> <!-- 使用局部组件App --> </div> <script> // 声明一个局部组件Vheader let Vheader = { data(){ return { } }, // 挂载父组件的属性,该组件中就能够使用,从父组件接收到的值也可再传给其子组件 props:['msg','post'], template:` <div class="vheader"> <h2>子组件Vheader start</h2> <p>{{ msg }}</p> <p>{{ post.title }}</p> <h2>子组件Vheader end</h2> </div> ` }; // 声明一个局部组件App let App = { data(){ return { text:"我是父组件App的数据", app_post:{ id: 1, title: 'hello world' } } }, // template:` <div class="app"> <Vheader :msg='text' :post='app_post'></Vheader> </div> `, components:{ Vheader // 挂载局部组件Vheader } }; new Vue({ el: '#app', data() { return { } }, components:{ App // 挂载局部组件App } }) </script>
总结:函数
1)在子组件中使用props声明,就能够在该组件中使用;post
2)从父组件中接收到的值也能够传递给他的子组件;ui
3)父组件中绑定自定义的属性;this
<div id="app"> <App></App> <!-- 使用局部组件App --> </div> <script> // 声明一个全局组件VBtn Vue.component('VBtn',{ data(){ return {} }, props:['id'], // 父组件Vheader传递过来的值 template:` <button @click="clickHandler">{{ id }}</button> `, methods:{ clickHandler(){ console.log(this); // 每一个组件中的this指的是当前组件对象 // this.$emit('父组件中声明的自定义的事件', ' 传值') this.id++; this.$emit('click_Handler', this.id); } } }); // 声明一个局部组件Vheader let Vheader = { data(){ return {} }, props:['post'], // 父组件App传递过来的数据 template:` <div class="vheader"> <VBtn :id='post.id' @click_Handler="fuClickHandler"></VBtn> </div> `, methods:{ fuClickHandler(val){ this.$emit('fatherHandler', val) // 往父组件App传值 } } }; // 声明一个局部组件App let App = { data(){ return { app_post:{ id: 1, title: 'hello world' } } }, template:` <div class="app"> {{ app_post.id }} <Vheader :post='app_post' @fatherHandler="father_handler"></Vheader> </div> `, methods:{ father_handler(val){ this.app_post.id = val } }, components:{ Vheader // 挂载局部组件Vheader } }; new Vue({ el: '#app', data() { return {} }, components:{ App // 挂载局部组件App } }) </script>
总结:
1)子组件中,经过this.$emit('父组件中自定义的事件名', '值'),来触发父组件中自定义的事件;
2)父组件中自定义事件(当前事件中接收子组件的),并为对应的子组件绑定(v-on)自定义的事件;
<div id="app"> <App></App> <!-- 使用局部组件App --> </div> <script> // TestA ==》 TestB 传值 // 平行组件传值前提:这两个方法必须绑定在同一个实例化对象(bus)上 let bus = new Vue(); // 声明一个Vue对象,只是用来平行组件间传值 // TestB要声明事件 bus.$on('事件的名字', function(val){}) // TestA要触发事件 bus.$emit('TestA组件中声明的事件名', '值') // 声明一个全局组件TestB Vue.component('TestB',{ data(){ return { text: "" } }, template:` <h2>{{ text }}</h2> `, created(){ // 声明事件 bus.$on('testData', (val) => { // 注意这里用箭头函数 this.text = val }) } }); // 声明一个全局组件TestA Vue.component('TestA',{ data(){ return { msg: "我是子组件TestA的数据" } }, template:` <button @click="clickHandler">TestA组件中按钮</button> `, methods:{ // 定义触发的函数 clickHandler(){ console.log(bus); bus.$emit('testData', this.msg) } } }); // 声明一个局部组件Vheader let Vheader = { data(){ return {} }, template:` <div class="vheader"> <TestA></TestA> <TestB></TestB> </div> `, }; // 声明一个局部组件App let App = { data(){ return {} }, template:` <div class="app"> <Vheader></Vheader> </div> `, components:{ Vheader // 挂载局部组件Vheader } }; // 根组件,能够没有template属性,直接在el中使用子组件 new Vue({ el: '#app', data() { return {} }, components:{ App // 挂载局部组件App } }) </script>
总结:(以A->B传值为例)
1)声明一个Vue对象(bus对象),只是用来平行组件间传值;
2)B要声明事件 bus.$on('事件的名字', function(val){});
3)A要触发事件 bus.$emit('TestA组件中声明的事件名', '值');
4)注意:记住平行组件传值前提是这两个方法必须绑定在同一个实例化对象(bus)上;
1)es5的普通函数,this指向是指向了调用者,好比vue实例的方法(在methods中声明了一个方法)是由vue实例vm调用的,因此this指向vm。
2)箭头函数的this指向它的调用者所在的上下文,也就是vm实例所在的上下文(定义vm的父类),即window。
三、将vue添加至chorme