VUE学习(一)、基于简单js引入的Vue快速入门——简单实例使用

VUE学习(一)、基于简单js引入的Vue快速入门——简单实例使用

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。-------------官方

一、hello world

1、引入vue.js

版本:2.x

VUE官网

在这里插入图片描述
将下载的vue.js文件引入项目文件中即可开始

<script src="./js/vue.js"></script>

以下案例默认已经引入vue.js文件!!!

下载 Vue Devtools 插件(vue官网有连接,可能需要科学上网)

2、实现hello world案例

<!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>初识vue</title>
        <script src="./js/vue.js"></script>
    </head>
    <body>
        <!-- 
            初识Vue
            1.vue工作必须创建一个vue实例,并且传入一个配置对象
            2.容器里面的代码依然符合html规范
            3.容器里面的代码被称为Vue模板
            4.vue实例和容器是一一对应关系
            5.真实开发中只会有一个Vue实例,并且配合组件一起使用
            6.一旦data中的数据发生改变,那么模板中用到的该数据地方也会改变
            7.{{xxx}},xx是js表达式,并且xx可以自动获取data中的所有数据
            8.{{xxx}} xxx还可以时Vue对象中的所有内容
        -->
        <div id="root">
            <!-- 花括号里可以写js表达式和js语句 -->
            <h2>hello {{name.toUpperCase()}}</h2>
            <h2>年龄:{{age}}</h2>
            <h2>{{'时间戳:'+Date.now()}}</h2>
            <h2>{{3>2}}</h2>
            <h2>{{msg}}</h2>
        </div>
        <script>
            //设置不能有提示  vue.js开发版会在控制台输出一些提示信息
            Vue.config.productionTip = false;

            //创建vue实例,参数{}为配置对象
            //vue实例和容器是一一对应关系
            new Vue({
                el: "#root", //el用于指定当前vue实例为哪个容器服务,通常为CSS选择器字符串,也可以是document.getElementById()
                data: {
                    // data 用于存储数据供 Vue实例的容器使用
                    name: "I_LOVE_make_bug",
                    age: 18,
                    msg: "Hello World!"
                }
            });
        </script>
    </body>
</html>

在这里插入图片描述

二、模板语法

1、插值语法

**{{xxx}}**两个嵌套的大括号中间放入Vue实例中的数据,或者js表达式等等这类方法称为插值语法

eg:

<!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>模板语法</title>
        <script src="./js/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <!-- 
                插值语法{{}}
             -->
            <span>{{name}}</span>
            <p>我的名字是{{name}},我在{{school.name}}读书,它位于{{school.address}}</p>
        </div>
        <script>
            Vue.config.productionTip =  false//阻止提示
            new Vue({
                el:"#root",
                data:{
                    name:'百度',
                    url:'http://www.baidu.com',
                    school:{
                        name:'xxx大学',
                        address:'山东省,淄博'
                    }
                }
            })
        </script>
    </body>
</html>

2、指令语法

指令语法是利用各种指令如:v-bind、v-if等实现某些共能(数据绑定、点击、遍历等,这里暂时了解即可)

<body>
        <div id="root">
            <!-- 
                插值语法{{}}
             -->
            <span>{{name}}</span>
            <!--
                 v-bind 可以简化为 : eg---- :x ,x是自定义属性
                 这类为指令语法
                 v-bind 表示绑定一个值
            -->
            <a v-bind:href="url" :x="url">这是一个连接</a>
            <br>
            <a v-bind:href="url.toUpperCase()" :x="url">这是一个连接</a>
            <p>我的名字是{{name}},我在{{school.name}}等你</p>
            <p>它位于{{school.address}}</p>
        </div>
        <script>
            Vue.config.productionTip =  false//阻止提示
            new Vue({
                el:"#root",
                data:{
                    name:'百度',
                    url:'http://www.baidu.com',
                    school:{
                        name:'xxx大学',
                        address:'山东省,淄博'
                    }
                }
            })
        </script>
</body>

实例1和实例2合起来的效果展示

在这里插入图片描述

三、数据绑定

<body>
		<!-- 
			Vue中有2种数据绑定的方式:
					1.单向绑定(v-bind):数据只能从data流向页面。
					2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。
						备注:
						1.双向绑定一般都应用在表单类元素上(如:input、select等)
						2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 普通写法 -->
			单向数据绑定:<input type="text" v-bind:value="name"><br/>
			双向数据绑定:<input type="text" v-model:value="name"><br/>

			<!-- 简写 -->
			单向数据绑定:<input type="text" :value="name"><br/>
			双向数据绑定:<input type="text" v-model="name"><br/>

			<!-- 如下代码是错误的,因为v-model只能应用在表单类元素(输入类元素)上 -->
			<!-- <h2 v-model:x="name">你好啊</h2> -->
		</div>
</body>

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

		new Vue({
			el:'#root',
			data:{
				name:'I_LOVE_MAKE_BUG'
			}
		})
</script>

对于上述的例子可能这样并不能很好的地看懂,此时就要用到之前提到的Vue Devtools插件,安装好以后在浏览器控制台会有一个vue选项,他就是这个插件给我们提供的调试vue的组件
在这里插入图片描述
点击vue选项进入
在这里插入图片描述
点击<Root>,此时就会出现vue实例对象包含的数据,我们可以对数据进行修改

1、测试双向绑定

1、在控制台修改数据,发现无论是单项还是双向都发生了变化
在这里插入图片描述
2、在页面修改数据双向绑定数据,同样无论双向还是单项都发生了变化
在这里插入图片描述

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

2、测试单项绑定

单项绑定只需要测试页面输入时控制台是否变化
在这里插入图片描述

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

四、el与data的两种写法

    <body>
		<!-- 
			data与el的2种写法
				1.el有2种写法
					(1).new Vue时候配置el属性。 即:el:'元素选择器'
					(2).先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。
						即:new Vue()等于一个实例,实例.$mount('元素选择器')
				2.data有2种写法
					(1).对象式
					(2).函数式
					如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。
				3.一个重要的原则:
					由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>你好,{{name}}</h1>
		</div>
	</body>

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

		//el的两种写法
		/* const v = new Vue({
			//el:'#root', //第一种写法
			data:{
				name:'I_LOVE_MAKE_BUG'
			}
		})
		console.log(v)
		v.$mount('#root') //第二种写法 */

		//data的两种写法
		new Vue({
			el:'#root',
			//data的第一种写法:对象式
			/* data:{
				name:'I_LOVE_MAKE_BUG'
			} */

			//data的第二种写法:函数式
			data(){
				console.log('@@@',this) //此处的this是Vue实例对象
				return{
					name:'I_LOVE_MAKE_BUG'
				}
			}
		})
	</script>

五、MVVM模型理解

<body>
        <!-- 
        M模型(model):对应data中的数据
        V视图(view):模板
        VM视图模型(ViewModel):Vue实例

        1.data中的所有数据最后都出现在了vm上
        2.vm上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用
     -->
        <div id="root">
            <h1>学校名称:{{name}}</h1>
            <h1>学校地址:{{address}}</h1>
        </div>
        <script>
            Vue.config.productionTip = false;
            new Vue({
                el: "#root",
                data: {
                    name: "山东理工大学",
                    address: "山东省,淄博市,张店区"
                }
            });
        </script>
    </body>

在这里插入图片描述

六、数据代理

1、回顾Object.defineProperty()

1)、 Object.defineProperty()语法说明

Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

Object.defineProperty(obj, prop, desc)
  1. obj 需要定义属性的当前对象
  2. prop 当前需要定义的属性名
  3. desc 属性描述符

存取描述符 --是由一对 getter、setter 函数功能来描述的属性

get:一个给属性提供getter的方法,如果没有getter则为undefined。该方法返回值被用作属性值。默认为undefined
set:一个给属性提供setter的方法,如果没有setter则为undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认值为undefined

测试一些属性:

<script type="text/javascript" >
			let number = 18
			let person = {
				name:'张三',
				sex:'男',
			}
			//给person设值了一个age字段
			Object.defineProperty(person,'age',{
				value:18,
				//enumerable:true, //控制属性是否可以枚举,默认值是false
				//writeable:true, //控制属性是否可以被修改,默认值是false
				// configurable:true //控制属性是否可以被删除,默认值是false

				//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
				// get(){
				// 	console.log('有人读取age属性了')
				// 	return number
				// },

				//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
				// set(value){
				// 	console.log('有人修改了age属性,且值是',value)
				// 	number = value
				// }

			})

			console.log(Object.keys(person))

			console.log(person)
</script>

2、何为数据代理

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

<script type="text/javascript" >
	let obj = {x:100}
	let obj2 = {y:200}
	Object.defineProperty(obj2,'x',{
		get(){
			return obj.x
		},
		set(value){
			obj.x = value
		}
	})
</script>

3、vue中的数据代理

<body>
	<!-- 
			1.Vue中的数据代理:
						通过vm对象来代理data对象中属性的操作(读/写)
			2.Vue中数据代理的好处:
						更加方便的操作data中的数据
			3.基本原理:
						通过Object.defineProperty()把data对象中所有属性添加到vm上。
						为每一个添加到vm上的属性,都指定一个getter/setter。
						在getter/setter内部去操作(读/写)data中对应的属性。
	 -->
	<!-- 准备好一个容器-->
	<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:'xx理工大学',
			address:'高老庄'
		}
	})
</script>

七、事件处理

1、事件基本使用

<body>
    <!-- 
        事件的基本使用:
		1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
		2.事件的回调需要配置在methods对象中,最终会在vm上;
		3.methods中配置的函数,不要用箭头函数!否则this就不是vm了;
		4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;
		5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参;
	-->
    <div id="root">
        <h2>欢迎来到{{name}}</h2>
        <!-- v-on:clic=>@click -->
        <button v-on:click="showInfo">点击提示信息1</button>
        <button @click="showInfo1">点击提示信息2</button>
        <button @click="showInfo2($event,3)">点击提示3</button>
    </div>
    <script>
        Vue.config.productionTip = false;
        new Vue({
            el: "#root",
            data: {
                name: "xx理工大学"
            },
            methods: {
                showInfo(e) {
                    console.log(e.target.innerText)
                    console.log(this) //此处的this就是Vue实例对象
                },
                showInfo1:(e)=>{
                    console.log(this); //此处的this是windows对象,所以一般不用箭头函数
                },
                showInfo2(e,id){
                    console.log(e)
                    console.log(`学生id为${id}`)
                }
            }
        });
    </script>
</body>

浏览器中打开依次点击三个按钮,结果如下图所示
在这里插入图片描述

2、常用事件修饰符

Vue中的事件修饰符:
1.prevent:阻止默认事件(常用);
2.stop:阻止事件冒泡(常用);
3.once:事件只触发一次(常用);
4.capture:使用事件的捕获模式;
5.self:只有event.target是当前操作的元素时才触发事件;
6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;

代码测试

<body>
    <div id="root">
        <h1>欢迎来到{{name}}</h1>
        <!-- 阻止默认事件(常用) .prevent-->
        <a href="http://www.baidu.com" @click.prevent="showInfo">点击提示信息</a>
        <!-- 阻止冒泡 -->
    </div>
    <script>
        Vue.config.productionTip = false;
        new Vue({
            el: "#root",
            data: {
                name: "xx理工大学"
            },
            methods: {
                showInfo(e) {
                    //e.preventDefault(); //阻止默认事件的一种方法
                    alert("同学你好");
                }
            }
        });
    </script>
    <style>
        * {
            padding: 10px;
        }
        .box1 {
            background-color: red;
        }
        .box2 {
            background-color: aqua;
        }
        .list {
            width: 200px;
            height: 200px;
            background-color: aqua;
            overflow: auto;
        }
        .list li {
            height: 100px;
        }
    </style>
    <div id="app">
        <button @click="hello('冬冬')">冬冬</button>
        <button v-on:click="hello('瑾瑾')">瑾瑾</button>
        <button @click="num++">计数</button>{{num}}
        <!-- 
            冒泡(事件传播):点击子元素,会触发父元素的点击事件
            (点击a,会触发div2,div1的点击事件)
            使用 v-on:事件.stop阻止事件传播 v-on.click.stop
                v-on:事件.prevent阻止本身事件
                v-on:事件.self只能点击本元素才能触发点击事件
                v-on:事件.once只会触发一次
            以及更多示例在vue官网
         -->
        <div @click.once="hello('div1')" style="width: 400px; height: 200px; background-color: aqua">
            div1区域
            <div @click.stop="hello('div2')" style="width: 200px; height: 150px; background-color: blueviolet">
                div2区域
                <br />
                <a
                    @click.stop.prevent="hello('div3')"
                    href="http://www.baidu.com"
                    style="display: block; width: 150px; height: 100px; background-color: brown">
                    链接区域3</a>
                <br/>
            </div>
        </div>
        <!-- 
            事件捕获 
            .capture
        -->
        <!-- 
            点击div2 会先输出div1,再输出div2
            事件在不获阶段就开始执行
         -->
        <div class="box1" @click.capture='showMsg("div1")'>
            div1
            <div class="box2" @click='showMsg("div2")'>div2</div>
        </div>
        <!-- 
        事件的默认行为立即执行,无需等待事件回调执行完毕
    -->
        <!-- 滚动条滚动 -->
        <ul @scroll="scroll" class="list">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
        <!-- 鼠标滚轮滚动 -->
        <ul @wheel.passive="scroll" class="list">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
        <!-- 
        滚动:当发生滚动时并没有立即使滚动条滚动,而是去处理滚动事件
        当事件处理完毕,才会去处理默认事件
        解决 :passive (用于优化)
    --></div>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                num: 0
            },
            methods: {
                hello(body) {
                    console.log(`${body},你好呀!`);
                },
                showMsg(msg) {
                    console.log(`输出${msg}`);
                },
                scroll() {
                    for (let i = 0; i < 10000; i++) {
                        setTimeout(function () {
                            console.log(i);
                        }, 1000);
                    }
                    //console.log("滚动了")
                }
            }
        });
        /*
    v-on用来绑定事件
    语法:v-on:事件名
    简写:eg:v-on:click  --->  @click
    */
    </script>
</body>

3、vue中的键盘事件

<body>
    <!-- 
			1.Vue中常用的按键别名:
						回车 => enter
						删除 => delete (捕获“删除”和“退格”键)
						退出 => esc
						空格 => space
						换行 => tab (特殊,必须配合keydown去使用)
						上 => up
						下 => down
						左 => left
						右 => right
			2.Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
			3.系统修饰键(用法特殊):ctrl、alt、shift、meta(win键)
						(1).配合keyup使用:按下修饰键的同时,再按下其他键,随后又释放其他键,事件才被触发。
						(2).配合keydown使用:正常触发事件。
			4.也可以使用keyCode去指定具体的按键(不推荐)eg:@keydown.13 不要用
			5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名 也不是很推荐
			6.@keydown还可以链式书写eg:@keydown.ctrl.y  (ctry+y)
	-->
    <!-- 准备好一个容器-->
    <div id="root">
        <h2>欢迎来到{{name}}学习</h2>
        <input type="text" placeholder="按下回车提示输入" @keydown.huiche="showInfo" />
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示。
    Vue.config.keyCodes.huiche = 13; //定义了一个别名按键
    new Vue({
        el: "#root",
        data: {
            name: "xx大学"
        },
        methods: {
            showInfo(e) {
                console.log(e.key, e.keyCode);
                console.log(e.target.value);
            }
        }
    });
</script>
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心醉瑶瑾前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值