vue_basic

目录

1.Vue是什么

2.Vue的特点

二、初识Vue

1.hello 小案例

 总结:

2.模板语法

1.插值语法

2.指令语法

3.数据绑定

1.单项绑定

2.双向绑定

4.el和data的两种写法

1.el

2.data

5.数据代理

1.Object.defineProperty方法

2.数据代理

3.vue中的数据代理 

 6.事件代理

1.事件基本使用

2.事件修饰符 

3.键盘事件

7.计算属性 

 8.监视属性

  深度监视

computed和watch之间的区别 :

9.绑定样式

10.条件渲染

1.v-if

2.v-show

11.列表渲染

1.基本列表

2.key的内部原理

 3.列表过滤

4.数据检测总结

12.收集表单数据

13.过滤器

14.内置指令

15.自定义指令

16.生命周期

认识

 分析

总结

17.组件

1.认识组件

 2.非单文件组件

3.组件嵌套

 4.VueComponent构造函数

5.Vue与VueComponent的关系

 16.单文件组件

总结

一、Vue简介

1.Vue是什么

一套用于构建用户界面的渐进式JS框架(就是把数据变成界面)

2.Vue的特点

采用组件化模式,提高代码复用率,且让代码更好维护

声明式编码,让编码人员无需直接操作DOM,提高开发效率

使用虚拟DOM+Diff算法,尽量复用DOM节点

解耦视图和数据

前端路由技术

二、初识Vue

1.hello 小案例

代码如下(示例):

<!-- 准备一个容器 -->
    <div id="root">
        <h1>hello,{{name}}</h1>
    </div>
    <script>
        Vue.config.productionTip=false;//设置为 false 以阻止 vue 在启动时生成生产提示。
        //创建vue实例
        new Vue({
            el:'#root',//el用于指定当前VUE实例为哪个容器服务,值通常为css选择器字符串
            data:{//data中用于存储数据,数据供el所指的定的那个容器去使用,值暂时先写成对象
                name:'小明'
            }
        });
    </script>

 总结:

1.想让Vue工作,必须搭建一个小的Vue实例,且要传入一个配置对象,如el, data

2.root容器里面的代码依然符合HTML规范,只不过混入了一些特殊的Vue语法

3.root容器里的代码被称为Vue模板

4.Vue实例和容器是一一对应的

5.真实开发中一直一个Vue实例,并且会配合组件一起使用

6.{{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性

7.一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新

2.模板语法

1.插值语法

用于解析标签体内容

写法: { { xxx } } xxx是js表达式,且xxx可以自动读取到data中的所有属性

<h3>你好,{{name}}</h3>

2.指令语法

用于解析标签(包括:标签属性,标签体内容,绑定事件)

例如v-bind:href="xxx"; 简写是 :href="xxx"; xxx是js表达式 

 <a v-bind:href="url">学习1</a>
        
 <a :href="url">学习2</a>

3.数据绑定

1.单项绑定

单项绑定(v-bind):数据只能从data流向页面

2.双向绑定

双向绑定(v-model):数据不仅能从data流向页面,还能从页面流向data

<input type="text" v-model:value="name">
<input type="text" v-model="name">  //简写

 注意:双向绑定一般都应用于表单类元素上

             v-model:value 简写成 v-model 因为 v-model默认收集的就是value值 

4.el和data的两种写法

1.el

new Vue 时候配置el属性  el: '#root'

先创建vue实例,再通过  vm.$mount('#root') 指定el的值

2.data

对象式

 data: {       
      name: '小明',
 } 

函数式  (不能使用箭头函数)

 data(){  
            console.log(this) //此处this是Vue实例对象
       return {
       name: '小明'
     }
 }

5.数据代理

1.Object.defineProperty方法

 Object.defineProperty(person,'age',{
            //当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
            get(){
                console.log('有人读取age属性');
                return number
            },
             //当有人修改person的age属性时,set函数就会被调用,且会收到修改的具体值
             set(value){
                console.log('有人修改age属性,且值是',value);
                number=value
            }
            value:18,
            enumerable:true,//控制属性是否可以遍历 默认值false
            writable:true,//控制属性是否可以被修改 默认值是false
            configurable:true, //控制属性是否可以被删除 默认值是false 
        })

2.数据代理

通过一个对象代理对另一个对象中的属性的操作 (读/写)

let obj={x:100};
let obj2={y:200};//通过obj2可以操作obj里面的x
Object.defineProperty(obj2,'x',{
     get(){
         return obj.x
     },
      set(value){
         obj.x=value
      }
})

3.vue中的数据代理 

通过vm对象来代理data对象中的属性的操作(读/写)

好处:方便的操作data中的数据

基本原理:通过Object.defineProperty()把data对象中所有属性添加到vm上

为每一个添加到vm上的属性都指定一个getter/setter

在getter/setter内部去操作(读/写)data中对应的属性

 6.事件代理

1.事件基本使用

1.使用v-on:xxx或者@xxx(简写)绑定事件,其中xxx是事件名

2.@click="demo"和@click="demo($event)"效果一样,后者可以传参

        <button v-on:click="showInfo">点我提示信息</button> 
        <button @click="showInfo1">点我提示信息1(不传参)</button>
        <button @click="showInfo2(1,$event)">点我提示信息2(传参)</button>

3.methods中配置的函数,都是被vue所管理的函数,不需要用箭头函数,否则this就不是指向vm或组件实例对象了

4.事件回调需要配置在methods对象中,最终会在vm上

 const vm=new Vue({
            el: '#root',
            data: {    
                name: '小明'},
            methods:{
                showInfo1(e){
                    console.log(this);//此处this是vm
                    alert(11)
                },
                showInfo2(number,event){
                    console.log(number);
                    alert(22) } } });

2.事件修饰符 

 <!-- 1. prevent:阻止默认事件(常用) -->
<a href="http://www.atguigu.com" @click.prevent="showInfo1">点我提示信息</a>
<!--  2.stop:阻止事件冒泡  (常用) -->
<div class="demo1" @click="showInfo2">
<button  @click.stop="showInfo2">点我提示信息</button>
 <!-- 阻止冒泡和跳转链接 -->
<a href="http://www.atguigu.com" @click.prevent.stop="showInfo2">点我提示信息</a>
 </div>
<!-- 3. once:事件只触发一次  (常用) -->
<button  @click.once="showInfo2">点我提示信息</button>

3.键盘事件

<input type="text" placeholder="按下回车提示输入" @keyup.enter="showInfo1">

 vue中常用按键别名

回车 enter      删除 delete     退出 esc      空格 space      换行 tab  配合keydown使用

换行 tab  配合keydown使用         上 up 下down  左 left  右 right

7.计算属性 

定义:要用的属性不存在,要通过已有的属性计算得来

get函数:当有人读取fullName时,get就会被调用,其返回值就作为fullName的值

get什么时候调用 1.初次读取fullName时,2.所依赖的数据发生改变时 如firstName,lastName改变

set什么时候调用 当fullName被修改时

 姓名: <span>{{ fullName}}</span>//data和methods中写什么vm就会出现什么
//计算属性是自动调用get拿到它的返回值然后放在vm上,放的名字叫fullName
computed:{
                fullName:{
                    get(){
                        return this.firstName+'-'+ this.lastName;//this是vm
                    },
                    set(value){
                        const arr=value.split('-');
                        this.firstName=arr[0];
                        this.lastName=arr[1]
                    }} }

 简写形式

 computed:{
                fullName(){
                    return this.firstName+'-'+ this.lastName;
                } }

 8.监视属性

 //第一种写法
             watch:{  监视的属性必须存在才能监视
                isHot:{
                    immediate:true,//初始化时让handler调用
                    //当isHot发生改变时调用
                    handler(newValue,oldValue){
                        console.log(111);
                    }
               }
 //简写 前提没有其它属性
               isHot(newValue,oldValue){
                   console.log(111);
               }
            } 

//第二种写法
vm.$watch('isHot',{
                    immediate:true,
                    handler(newValue,oldValue){
                        console.log(111);
                    }
                })
 //简写
        vm.$watch('isHot',function(newValue,oldValue){
                    console.log(111);
         })

  深度监视

watch:{  
                //监视多级结构中某个属性的变化
                // 'number.a':{
                //    handler(){
                //     console.log('a变了');
                //    }
                // }
                 //监视多级结构中所有属性的变化
                numbers:{
                    deep:true,
                    handler(){
                    console.log('a变了');
                   }
                }
            }

总结:vue中的watch默认不检测对象内部值的改变,配置deep:true可以检测对象内部值的改变

computed和watch之间的区别 :

    1.computed能完成的功能,watch都能完成

    2.watch能完成的功能,computed不一定能完成,如watch可以进行异步操作

    3.所被vue管理的函数,最好写成普通函数,这样this指向才是vm或组件实例对象

    4.所有不被vue管理的函数(定时器的回调,ajax的回调,promise的回调),最好写成箭头函数,这样this的指向才是vm或组件实例对象 

9.绑定样式

<!-- 绑定class样式  字符串写法 适用于:样式的类名不确定需要动态指定 -->
        <div class="basic" :class="a" @click="mood">{{name}}</div> <br><br>

        <!-- 绑定class样式  数组写法 适用于:要绑定的样式个数和名字不确定 -->
        <div class="basic" :class="classArr">{{name}}</div>  <br><br>

        <!-- 绑定class样式  对象写法 适用于:要绑定的样式个数和名字确定,但要动态决定用不用 -->
        <div class="basic" :class="Obj">{{name}}</div> <br><br>

        <!-- 绑定style样式  对象写法 -->
        <div class="basic" :style="styleObj">{{name}}</div>
 new Vue({
            el: '#root',
            data: {
                name: '小明',
                a:'normal',
                classArr:['atguigu1','atguigu2','atguigu3'],
                Obj:{
                    atguigu1:false,
                    atguigu2:false
                },
                styleObj:{
                    fontSize:'40px'
                }
            },
            methods: {
                mood(){
                    const arr=['happy','sad','normal'];
                    this.a=arr[Math.floor(Math.random()*3)]
                }
            },
        });

10.条件渲染

1.v-if

适用于:切换频率较低的场景

特点:不展示的DOM元素直接被移除

v-if可以和v-else-if,v-else一起使用,但要求结果不能被打断

 <h2 v-if="false">欢迎{{name}}</h2>
        <div v-if="n===1">1</div>
        <div v-else-if="n===2">2</div>
        <div v-else>3</div>

2.v-show

适用于:切换频率较高的场景

特点:不展示的DOM元素仅仅是使用样式隐藏起来

<h2 v-show="false">欢迎{{name}}</h2>

11.列表渲染

1.基本列表

<!-- 遍历数组-->
        <ul>
            <li v-for="p in persons" :key="p.id">{{p.name}}-{{p.age}}</li>
        </ul>
<!-- 遍历对象 -->
        <ul>
            <li v-for="(value,k) in cars" :key="k">
                {{k}}-{{value}}
            </li>
        </ul>

2.key的内部原理

1.虚拟DOM中key的作用:

 key是虚拟DOM对象的标识,当数据发生变化时,vue会根据新数据产生新的虚拟DOM,随后vue进行新虚拟DOM与旧虚拟DOM的差异比较。

2.对比规则

(1)旧虚拟DOM中找到了与新虚拟DOM相同的key:

若虚拟DOM中内容没变,直接使用之前的真实的DOM

若虚拟DOM中内容改变,则生成新的真实DOM,随后替换掉页面之前的真实DOM

(2)旧虚拟DOM中未找到与新虚拟DOM相同的key

创建新的真实DOM,随后渲染到页面

3.用index作为key可能会引发的问题

(1)若对数据进行:逆序添加删除等破坏顺序操作会产生没有必要的真实DOM更新效率低

(2)如果结构中还包含输入类的DOM会产生错误更新

4.开发中如何选择key

最好使用每条数据的唯一标识作为key,如id,身份证号

 3.列表过滤

//用watch实现
watch: {
                keyWord: {
                    immediate: true,
                    handler(val) {
                        //过滤的数组重新赋值给一个新数组
                        this.filpersons = this.persons.filter((p) => {
                            return p.name.indexOf(val) !== -1;
                        })
                    }
                }
            }
//用computed实现
 computed: {
                filpersons() {
                    return  this.persons.filter((p) => {
                        return p.name.indexOf(this. keyWord) !== -1;
                    })
                }
            }

4.数据检测总结

  Vue监视数据的原理:

1. vue会监视data中所有层次的数据。

2. 如何监测对象中的数据?

通过setter实现监视,且要在new Vue时就传入要监测的数据。

 (1).对象中后追加的属性,Vue默认不做响应式处理

(2).如需给后添加的属性做响应式,请使用如下API:

Vue.set(target,propertyName/index,value) 或

vm.$set(target,propertyName/index,value)

3. 如何监测数组中的数据?

 通过包裹数组更新元素的方法实现,本质就是做了两件事:

(1).调用原生对应的方法对数组进行更新。

 (2).重新解析模板,进而更新页面。

4.在Vue修改数组中的某个元素一定要用如下方法:

1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()

 2.Vue.set() 或 vm.$set()

 特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

  <button @click="student.age++">年龄+1</button> <br>
      <button @click="updatex">添加性别属性,默认值:男</button>  <br>
      <button @click="updatef1">在列表首位添加一个朋友</button><br>
      <button @click="updatef2">修改第一个朋友的名字为张三</button><br>
      <button @click="updateh1">添加一个爱好</button><br>
      <button @click="updateh2">修改第一个爱好开车</button><br>
      <button @click="remove">过滤爱好中的抽烟</button><br>
 methods: {
                updatex(){
                    Vue.set(this.student,'sex','男')
                    //this.$set(this.student,'sex','男')
                },
                updatef1(){
                    this.student.friends.unshift({name:'3',age:70})
                },
                updatef2(){
                    this.student.friends[0].name='张三'
                },
                updateh1(){
                    this.student.hobby.push('吃饭')
                },
                updateh2(){
                    //this.student.hobby.splice(0,1,'开车')
                    Vue.set(this.student.hobby,0,'开车')
                },
                remove(){
                    this.student.hobby=this.student.hobby.filter((h)=>{
                        return h!=='抽烟'
                    }
                    )
                }
            },

12.收集表单数据

收集表单数据:

若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。

若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。

若:<input type="checkbox"/>

1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)

2.配置input的value属性:

(1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)

(2)v-model的初始值是数组,那么收集的的就是value组成的数组

 备注:v-model的三个修饰符:

 lazy:失去焦点再收集数据

 number:输入字符串转为有效的数字

 trim:输入首尾空格过滤

 <form @submit.prevent="demo">
           账号: <input type="text" v-model.trim="account" > <br><br>
           年龄:<input type="number" v-model.number="age" > <br><br>
           性别: 男<input type="radio" name="sex" value="female" v-model="sex"> 
           爱好: 学习<input type="checkbox"  v-model="hobby" value="study">
           吃饭<input type="checkbox" v-model="hobby" value="eat"> 
           打豆豆<input type="checkbox" v-model="hobby" value="play">  <br><br>
           所属校区:
        <select v-model="city" >
            <option value="">请选择校区</option>
            <option value="beijing">北京</option>
        </select> <br><br>
        其它信息:
        <textarea  v-model.lazy="other"></textarea> <br><br>
       <input type="checkbox" v-model="agree">阅读并接受<a href="http://www.atguigu.com"> 
       用户协议</a>
      data: {
               account:'',
               password:'',
               age:'',
               sex:'',
               hobby:[], //重点
               city:'beijing',
               other:'',
               agree:''
            },
       

13.过滤器

过滤器:

定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。

语法:1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}

           2.使用过滤器:{{ xxx | 过滤器名}}  或  v-bind:属性 = "xxx | 过滤器名"

备注:1.过滤器也可以接收额外参数、多个过滤器也可以串联

            2.并没有改变原本的数据, 是产生新的对应的数据

      //全局过滤器
    <div id="root2">
        <h2 >{{msg | mySlice}}</h2>
    </div>
        Vue.filter('mySlice',function(value){
            return value.slice(0,4)
        })       
     //局部过滤器
         <!-- 过滤器 -->
        <h3>现在{{ time |timeFormater }}</h3>
        <!-- 过滤器 传参-->
        <h3>现在{{ time |timeFormater('YYYY__MM__DD') |mySlice }}</h3>
            filters:{
                timeFormater(value,str='YYYY年MM月DD日 HH:mm:ss'){
                    return  dayjs(value).format(str)
                },
                mySlice(value){
                    return  value.slice(0,4)
                }
            }

14.内置指令

我们学过的指令:

                        v-bind  : 单向绑定解析表达式, 可简写为 :xxx

                        v-model : 双向数据绑定

                        v-for   : 遍历数组/对象/字符串

                        v-on    : 绑定事件监听, 可简写为@

                        v-if    : 条件渲染(动态控制节点是否存存在)

                        v-else  : 条件渲染(动态控制节点是否存存在)

                        v-show  : 条件渲染 (动态控制节点是否展示)

v-text指令:

                        1.作用:向其所在的节点中渲染文本内容。

                        2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

v-html指令

                        1.作用:向指定节点中渲染包含html结构的内容。

                        2.与插值语法的区别:

                                (1).v-html会替换掉节点中所有的内容,{{xx}}则不会。

                                (2).v-html可以识别html结构。

v-cloak指令(没有值):

                        1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。

                        2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。

v-once指令:

                        1.v-once所在节点在初次动态渲染后,就视为静态内容了。

                        2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

 v-pre指令:

                    1.跳过其所在节点的编译过程。

                    2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

       <!--v-text指令:  -->
        <div v-text="name">11111</div>
        <!--v-html指令: str:'<h3>你好呀</h3>' -->
        <div v-html="str">11111</div> 
        <!-- v-once指令 -->
        <div>
            <h2 v-once>初始化{{n}}</h2>
            <h2>当前n的值{{n}}</h2>
            <button @click="n++">点我n+1</button>
        </div>
         <!-- v-pre指令 --> 
            <h2 v-pre>vue很简单</h2>
 

15.自定义指令

  一、定义语法:

(1).局部指令:

        new Vue({                                                           new Vue({

            directives:{指令名:配置对象}   或           directives{指令名:回调函数}

            })                                                                      })

(2).全局指令:

        Vue.directive(指令名,配置对象) 或   Vue.directive(指令名,回调函数)

   二、配置对象中常用的3个回调:

        (1).bind:指令与元素成功绑定时调用。

        (2).inserted:指令所在元素被插入页面时调用。

        (3).update:指令所在模板结构被重新解析时调用。

   三、备注:

        1.指令定义时不加v-,但使用时要加v-;

        2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

directives:{
         定义一个v-big指令,和v-text功能类似,但会把数值放大10倍 
                //bid函数合适调用 1.指令与元素成功绑定时  2.指令所在的模板被重新解析时
                big(element,binding){
                    element.innerText=binding.value*10
                    console.log('big',this);//this指向window
                },
         定义一个v-fbind指令,和v-bind功能类似,但可以让其绑定的input元素默认获取焦点
                fbind:{
                    //指令与元素成功绑定时
                    bind(element,binding){
                        element.value=binding.value
                    },
                    //指令所在元素插入页面时
                    inserted(element,binding){
                        element.focus()
                    },
                    //指令所在的模板被重新解析时
                    update(element,binding){
                        element.value=binding.value
                    }
                }  
            }

16.生命周期

认识

1.又名:生命周期回调函数、生命周期函数、生命周期钩子。

2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。

 3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。

4.生命周期函数中的this指向是vm 或 组件实例对象。

 分析

1.初始化事件和生命周期,但数据代理还没有开始

2.第一个生命周期函数:beforeCreate 因为此时数据代理还未开始,所以通过vm不能访问data中的数据,methods中的方法

3.初始化完成数据监测,数据代理

4.第二个生命周期函数:created 可以通过vm访问data中的数据,methods中的方法

5.有没有传 el ,有没有template这个选项,没有编译el外部的html作为模板,此阶段vue开始解析模板,生成虚拟DOM(内存中),页面还不能显示解析好的内容。

 6.第三个生命周期函数:beforeMount  此时页面呈现的是未经vue解析的DOM结构,所有对DOM的操作最终都不奏效

7.将内存中的虚拟DOM转为真实DOM插入页面

8.第四个生命周期函数 :mounted  此时页面呈现的都是经过编译的DOM

9.当数据改变时 第五个生命周期函数 :beforeUpdate  数据是新的,页面还没来得及更新

10.新旧DOM比较

11.第六个生命周期函数 :update 数据页面都是新的

12.当vm.$destroy()调用时,就销毁这个实例,清理与其它实例的连接,解绑全部指令和自定义事件监听器

13.第七个生命周期函数: beforeDestroy 销毁之前  能访问数据,能调用方法,但是所有对数据的修改不会再触发更新

14.第八个生命周期函数: destroyed

总结

常用的生命周期钩子:

1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。

2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

 关于销毁Vue实例

1.销毁后借助Vue开发者工具看不到任何信息。

2.销毁后自定义事件会失效,但原生DOM事件依然有效。

3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

17.组件

1.认识组件

定义:实现应用中局部功能代码(html,css,ja)和资源(音频,视频等)的集合

 

 2.非单文件组件

Vue中使用组件的三大步骤:

 一、定义组件(创建组件)

二、注册组件

三、使用组件(写组件标签)

 一、如何定义一个组件?

使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;

1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

 2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。

备注:使用template可以配置组件结构。

二、如何注册组件?

1.局部注册:靠new Vue的时候传入components选项

2.全局注册:靠Vue.component('组件名',组件)

三、编写组件标签:      <school></school>

 //创建 student组件
         const student=Vue.extend({
            template:`
                <div>
                    <h2>学生姓名:{{studentName}}</h2>
                    <h2>学校名称:{{age}}</h2>
                </div>
            `,
            data(){
                return{
                    studentName:'小明',
                    age:18
                }
            }
        }) ;
 new Vue({
            el: '#root',
            data:{
                msg:'你好'
            },
 //第二步注册组件(局部)
            components:{
                school,
                student
            }
        });
 //全局注册组件
          Vue.component('hello',hello);
 <!-- 第三步编写组件标签 -->
  <student></student>   

几个注意点:

1.关于组件名:

一个单词组成:

第一种写法(首字母小写):school

  第二种写法(首字母大写):School

多个单词组成:

第一种写法(kebab-case命名):my-school

第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)

备注: (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。

           (2).可以使用name配置项指定组件在开发者工具中呈现的名字。

2.关于组件标签:

第一种写法:<school></school>

 第二种写法:<school/>

备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

3.一个简写方式:

 const school = Vue.extend(options) 可简写为:const school = options

//简写
const school={
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <h2>学校名称:{{address}}</h2>
                    <button @click="showName">点我提示学校名</button>
                </div>
            `,
            data(){ 
                return{
                    schoolName:'小米',
                    address:'合肥'
                }
            },
            methods: {
                showName(){
                    alert(this.schoolName)
                }
            },
        }

3.组件嵌套

      //创建 student组件
        const student = .....
        //创建 school组件
        const school = {
            template: `
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <student></student>
                </div>
            `,
            data() {
                return {
                    schoolName: '小米',
                }},
            components:{   //注册组件
                 student   
            }}
        //定义hello组件
        const hello=.....
        //定义app组件
        const app={
            template: `
                <div>
                    <hello></hello>
                    <school></school>
                </div>
            `,
            components:{
                school,
                hello
            } }
        new Vue({
            template:`<app></app`,
            el: '#root',
            components: {
               app
            } });

 4.VueComponent构造函数

关于VueComponent:

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。

3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

4.关于this指向:

(1).组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。

(2).new Vue(options)配置中: data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。

Vue的实例对象,以后简称vm。

5.Vue与VueComponent的关系

1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype  VueComponent的原型对象的原型对象=Vue的原型对象

2.为什么要有这个关系:让组件实例对象(vc,可以说是一个小型的vm)可以访问到 Vue原型上的属性、方法。

 16.单文件组件

 <!-- 组件的结构 -->
<template>
  <div class="demo">
    <h2>学校名称:{{ schoolName }}</h2>
    <h2>学校名称:{{ address }}</h2>
    <button @click="showName">点我提示学校名</button>
  </div>
</template>
<script>
// 组件交互相关的代码(数据,方法等等)
export default {
  name:'School',
  data() {
    return {
      schoolName: "小米",
      address: "合肥",
    };
  },
  methods: {
    showName() {},
  },
};
</script>
<style lang="">
/* 组件的样式 */
.demo {
  background-color: pink;
}
</style>


总结

4.14到4.19 basic终于结束



“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值