Vue学习【第一篇】:Vue初识与指令

什么是Vue

什么是Vue
Vue.js是一个渐进式JavaScript框架它是构建用户界面的JavaScript框架(让它自动生成js,css,html等)
渐进式:vue从小到控制页面中的一个变量到页面一块内容到整个页面,最终大到整个项目,东可以用vue框架来实现

vue可以干哪些事
将数据渲染到指定区域(数据可以是后台获取,也可以由前台自己产生)
可以与页面完成基于数据的交互方式

为什么学习Vue
1.整合了Angular React框架的优点(第一手API文档是中文的)
2.单页面应用(得益于vue的组件化开发 => 前台代码的复用)
3.虚拟DOM(提高操作DOM的效应)
4.数据的双向绑定

怎么使用Vue

1、引入vue.js

2、展示HTML

<div id="app">
    <p>{{msg}}</p>
    <p>{{ 80+2 }}</p>
    <p>{{ 20>30 }}</p>
    <h1 v-text="msg"></h1>
    <h1 v-html="hd"></h1>
    <h1 v-html="str"></h1>
</div>

3、建立一个vue对象

vue对象需要手动创建, 原因,一个vue对象可以只控制页面中的某一部分, 如果一个页面有多个部分都需要被控制,那么就需要创建多个vue对象
vue对象如何与控制的页面进行关联(绑定),采用的是vue对象中的挂载点(挂载点可以唯一标识页面中的某一个区域)

<body>
    <div id="app">
        {{ msg }}
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    // Vue实例会根据数据产生虚拟DOM,最终替换掉挂载点的真实DOM(不要挂在到body上)
    var app = new Vue({
        el: ‘#app‘,     //挂载点
        data: {
            msg: "赢在今日"
        }
    });

    // 如果需要使用vue对象(实例), 那么久可以接受Vue创建的结果, 反之就不需要接收
    console.log(app);
    console.log(app.$attrs); // vue实例的变量都是以$开头
    console.log(app.$el);
    console.log(app.$data.msg);
    console.log(app.msg);
    // app对象 = new Vue()实例 = 标签div#app组件
</script>

Vue实例

el:实例

new Vue({
    el: ‘#app‘
})
// 实例与页面挂载点一一对应
// 一个页面中可以出现多个实例对应多个挂载点
// 实例只操作挂载点内部内容

data:数据

<div id=‘app‘>
    {{ msg }}
</div>
<script>
    var app = new Vue({
    	el: ‘#app‘,
    	data: {
    		msg: ‘数据‘,
    	}
    })
    console.log(app.$data.msg);
    console.log(app.msg);
</script>
<!-- data为插值表达式中的变量提供数据 -->
<!-- data中的数据可以通过Vue实例直接或间接访问--> 

methods:方法

<style>
    .box { background-color: orange }
</style>
<div id=‘app‘>
    <p class="box" v-on:click="pClick">测试</p>
	<p class="box" v-on:mouseover="pOver">测试</p>
</div>
<script>
    var app = new Vue({
    	el: ‘#app‘,
    	methods: {
            pClick () {
                // 点击测试
            },
            pOver () {
                // 悬浮测试
            }
    	}
    })
</script>
<!-- 了解v-on:为事件绑定的指令 -->
<!-- methods为事件提供实现体-->

computed:计算

<div id="app">
 	<input type="text" v-model="a">
    <input type="text" v-model="b">
    <div>
        {{ c }}
    </div>
</div>

<script>
	// 一个变量依赖于多个变量
    new Vue({
        el: "#app",
        data: {
            a: "",
            b: "",
        },
        computed: {
            c: function() {
                // this代表该vue实例
                return this.a + this.b;
            }
        }
    })
</script> 

watch:监听

<div id="app">
 	<input type="text" v-model="ab">
    <div>
        {{ a }}
        {{ b }}
    </div>
</div>

<script>
	// 多个变量依赖于一个变量
    new Vue({
        el: "#app",
        data: {
            ab: "",
            a: "",
            b: "",
        },
        watch: {
            ab: function() {
                // 逻辑根据需求而定
                this.a = this.ab[0];
                this.b = this.ab[1];
            }
        }
    })
</script>

delimiters:分隔符

<div id=‘app‘>
    ${msg}
</div>
<script>
    new Vue({
    	el: ‘#app‘,
    	data: {
    		msg: ‘message‘
    	},
        delimiters: [‘${‘,‘}‘]
    })
</script>

生命周期钩子

表示一个vue实例从创建到销毁的这个过程,将这个过程的一些时间节点赋予了对应的钩子函数

钩子函数: 满足特点条件被回调的方法

new Vue({
    el: "#app",
    data: {
        msg: "message"
    },
    beforeCreate () {
        console.log("实例刚刚创建");
        console.log(this.msg);
    },
    created () {
        console.log("实例创建成功, data, methods已拥有");
        console.log(this.msg);
    },
    mounted () {
        console.log("页面已被vue实例渲染, data, methods已更新");
    }
    // 拿到需求 => 确定钩子函数 => 解决需求的逻辑代码块
})

Vue的指令

指令:是带有v-前缀的特殊属性,通过属性来操作元素

文本相关指令

<div id="app">
    <!-- 插值表达式 -->
    <p>{{ msg }}</p>
    <!-- eg:原文本会被msg替换 -->
    <p v-text=‘msg‘>原文本</p>
    <!-- 可以解析带html标签的文本信息 -->
    <p v-html=‘msg‘></p>
    <!-- v-once控制的标签只能被赋值一次 -->
    <p v-once>{{ msg }}</p>
</div>
<script type="text/javascript">
	// 指令: 出现在html标签中可以被vue解析处理的全局属性
	new Vue({
		el: "#app",
		data: {
			msg: "message"
		}
	})
</script>

斗篷指令

<style type="text/css">
    [v-cloak] { display: none; }
</style>
<div id="app" v-cloak>
    {{ msg }}
</div>
<script src="js/vue.min.js"></script>
<script type="text/javascript">
	new Vue({
		el: "#app",
		data: {
			msg: "message"
		}
	})
</script>
<!-- 避免页面闪烁--> 

属性指令

<!-- 给自定义全局属性绑定变量 -->
<p v-bind:abc="abc"></p>
<!-- 以原字符串形式绑定全局属性 -->
<p v-bind:title="‘abc‘"></p>

<!-- 单类名绑定 -->
<p v-bind:class="c1"></p>
<!-- 多类名绑定 -->
<p v-bind:class="[c2, c3]"></p>
<!-- 类名状态绑定 -->
<p v-bind:class="{c4: true|false|var}"></p>
<!-- 多类名状态绑定 -->
<p v-bind:class="[{c5: true}, {c6: flase}]"></p>

<!-- 样式绑定 -->
<div :style="div_style"></div>
<div :style="{width: ‘100px‘, height: ‘100px‘, backgroundColor: ‘blue‘}"></div>
<script type="text/javascript">
	new Vue({
		el:"#app",
		data: {
            abc: "abc",
            c1: "p1",
            c2: "p2",
            c3: "p3",
			div_style: {
				width: "200px",
				height: "200px",
				backgroundColor: "cyan"
			}
		}
	})
</script>
<!-- v-bind: 指令可以简写为 : --> 

事件指令

<!-- v-on: 指令 简写 @ -->
<!-- 不传参事件绑定,但事件回调方法可以获取事件对象 -->
<p @click="fn"></p>
<!-- ()可以传入具体实参 -->
<p @click="fn()"></p>
<!-- ()情况下,事件对象应该显式传入 -->
<p @click="fn($event)"></p>

表单指令

<div id="app">
    <!-- v-model针对于表单元素 -->
    <form action="" method="get">
        <!-- 1、双向绑定:服务于文本输入框 -->
        <!-- v-model存储的值为输入框的value值 -->
        <div>
            <input type="text" name="usr" v-model="in_val">
            <input type="password" name="ps" v-model="in_val" >
            <textarea name="info" v-model="in_val"></textarea>
        </div>

        <!-- 2、单选框 -->
        <div>
            <!-- 单选框是以name进行分组,同组中只能发生单选 -->
            <!-- v-model存储的值为单选框的value值 -->
            男:<input type="radio" name="sex" value="男" v-model="ra_val">
            女:<input type="radio" name="sex" value="女" v-model="ra_val">
            {{ ra_val }}
        </div>

        <!-- 3、单一复选框 -->
        <!-- v-model存储的值为true|false -->
        <!-- 或者为自定义替换的值 -->
        <div>
            <input type="checkbox" v-model=‘sin_val‘ true-value="选中" false-value="未选中" />
            {{ sin_val }}
        </div>

        <!-- 4、多复选框 -->
        <!-- v-model存储的值为存储值多复选框value的数组 -->
        <div>
            <input type="checkbox" value="喜好男的" name="cless" v-model=‘more_val‘ />
            <input type="checkbox" value="喜好女的" name="cless" v-model=‘more_val‘ />
            <input type="checkbox" value="不挑" name="cless" v-model=‘more_val‘ />
            {{ more_val }}
        </div>
    </form>
</div>

<script type="text/javascript">
	new Vue({
		el: ‘#app‘,
		data: {
			in_val: ‘‘,
			// 默认值可以决定单选框默认选项
			ra_val: ‘男‘,
			// 默认值为true,单一复选框为选中,反之false为不选中
			sin_val: ‘‘,
			// 数组中存在的值对应的复选框默认为选中状态
			more_val: [‘喜好女的‘,‘不挑‘]
		}
	})
</script>

条件指令

<div id="app">
    <button @click="toggle">显隐切换</button>
    <!-- v-if -->
    <div class="box r" v-if="isShow"></div>
    <!-- v-show -->
    <div class="box o" v-show="isShow"></div>
    <!-- 1.条件渲染的值为true|false -->
    <!-- 2.true代表标签显示方式渲染 -->
    <!-- 3.false v-if不渲染到页面,v-show以display:none渲染到页面,但也不会显示 -->

    <!-- v-if v-else-if v-else 案例 -->
    <ul>
        <li @mouseover="changeWrap(0)">red</li>
        <li @mouseover="changeWrap(1)">green</li>
        <li @mouseover="changeWrap(2)">blue</li>
    </ul>
    <!-- red页面逻辑结构 -->
    <div class="wrap red" v-if="tag == 0" key="0">...</div>
    <!-- green页面逻辑结构 -->
    <div class="wrap green" v-else-if="tag == 1" key="1">...</div>
    <!-- blue页面逻辑结构 -->
    <div class="wrap blue" v-else key="2">...</div>
    <!-- v-if相关分支操作,在未显示情况下,是不会被渲染到页面中 -->
    <!-- 通过key全局属性操作后,渲染过的分支会建立key对应的缓存,提高下一次渲染速度 -->

    <!-- v-show 案例 -->
    <ul>
        <li @mouseover="changeMain(0)">red</li>
        <li @mouseover="changeMain(1)">green</li>
        <li @mouseover="changeMain(2)">blue</li>
    </ul>
    <!-- red页面逻辑结构 -->
    <div class="main red" v-show="whoShow(0)">...</div>
    <!-- green页面逻辑结构 -->
    <div class="main green" v-show="whoShow(1)">...</div>
    <!-- blue页面逻辑结构 -->
    <div class="main blue" v-show="whoShow(2)">...</div>
</div>
<script type="text/javascript">
	new Vue({
		el: "#app",
		data: {
			isShow: false,
			tag: 0,
			flag: 0
		},
		methods: {
			toggle () {
				this.isShow = !this.isShow;
			},
			changeWrap (num) {
				this.tag = num;
			},
			changeMain (num) {
				// this.flag num
				this.flag = num;
			},
			whoShow (num) {
				// this.flag num
				return this.flag == num;
			}
		}
	})
</script>

循环指令

<div id="app">
    <h1>{{ msg }}</h1>
    <!-- v-for="item in items" -->
    <!-- 遍历的对象: 数组[] 对象(字典){} -->
    <ul>
        <li>{{ list[0] }}</li>
        <li>{{ list[1] }}</li>
        <li>{{ list[2] }}</li>
        <li>{{ list[3] }}</li>
        <li>{{ list[4] }}</li>
    </ul>

    <!-- n为遍历的元素值 -->
    <ul>
        <li v-for="n in list">{{ n }}</li>
    </ul>

    <!-- 一般列表渲染需要建立缓存 -->
    <!-- 列表渲染是循环,需要赋值变量给key,使用key需要v-bind:处理 -->
    <!-- v-for变量数组[]时,接收两个值时,第一个为元素值,第二个为元素索引 -->
    <ul>
        <li v-for="(n, i) in list" :key="i">value:{{ n }} | index: {{ i }}</li>
    </ul>

    <ul>
        <li>{{ dic[‘name‘] }}</li>
        <li>{{ dic.age }}</li>
        <li>{{ dic.gender }}</li>
    </ul>

    <!-- v-for变量对象{}时,接收三个值时,第一个为元素值,第二个为元素键,第三个为元素索引 -->
    <ul>
        <li v-for="(v, k, i) in dic" :key="k">value:{{ v }} | key:{{ k }} | index: {{ i }}</li>
    </ul>

    <!-- 遍历的嵌套 -->
    <div v-for="(person, index) in persons" :key="index" style="height: 21px;">
        <div v-for="(v, k) in person" :key="k" style="float: left;">{{ k }} : {{ v }}   </div>
    </div>
</div>
<script type="text/javascript">
	new Vue({
		el: "#app",
		data: {
			msg: "列表渲染",
			list: [1, 2, 3, 4, 5],
			dic: {
				name: ‘zero‘,
				age: 88888,
				gender: ‘god‘
			},
			persons: [
				{name: "zero", age: 8},
				{name: "egon", age: 78},
				{name: "liuXX", age: 77},
				{name: "yXX", age: 38}
			]
		}
	})
</script>

todolist案例

<div id="app">
    <div>
        <input type="text" v-model="val">
        <button type="button" @click="submitMsg">提交</button>
    </div>
    <ul>
        <li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li>
    </ul>
    {{ list }}
</div>
<script type="text/javascript">
	new Vue({
		el: "#app",
		data: {
			val: "",
			list: []
		},
		methods: {
			submitMsg () {
				if (this.val) {
					this.list.push(this.val);
					this.val = ""
				}
			},
			removeMsg(index) {
				this.list.splice(index, 1)
			}
		}
	})
</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">
    <title>Title</title>
    <script src="vue.js"></script>

</head>
<body>
<div id="app">
    <input type="text" v-focus>
</div>
<script>
       new Vue({
            el:"#app",
            data:{

            },
           directives:{ //directives定义指令的
                focus:{   //focus指令的名字
                    inserted:function (els) {    //els绑定的这个元素
                        //inserted当绑定的这个元素  <input type="text" v-focus>显示的时候,
                        els.focus();  //获取焦点的一个方法,和以前的时候是一样的
                        els.style.backgroundColor="blue";
                        els.style.color=‘#fff‘
                    }
                }
           }
        })
    </script>
</body>
</html>

实现tag切换的小示例

<!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">
    <title>Title</title>
    <script src="vue.js"></script>
    <style>
        ul li{
            list-style: none;
            display: inline-block;
            border: 1px solid cornflowerblue;
            height: 50px;
            width: 200px;
            background: cornflowerblue;
            text-align: center;
            line-height: 50px;

        }
    </style>
</head>

<body>
<div id="mybox">
    <ul>
        <li><span v-on:click="qh(true)">二维码登录</span></li>
        <li><span v-on:click="qh(false)">邮箱登录</span></li>
    </ul>
    <div v-if="temp">
        <img src="erweima.png" >
    </div>
    <div v-if="!temp">  <!--取反-->
        <form action="http://mail.163.com" method="post">
            <!--method是为了安全   ,action:提交的地址-->
            <p>邮箱:<input type="email"></p>
            <p>密码:<input type="password"></p>
            <p><input type="submit" value="登录"></p>
        </form>
    </div>
</div>
<script>
    new Vue({
        el:"#mybox",  //表示当前这个元素开始使用vue
        data:{
            temp:true
        },
        methods:{
            qh:function (t) {
                this.temp=t
            }
        }
    })
</script>
</body>
</html>

  

原文地址:https://www.cnblogs.com/596014054-yangdongsheng/p/10228430.html

时间: 2024-09-29 01:43:25

Vue学习【第一篇】:Vue初识与指令的相关文章

C++的笔记学习第一篇,认识C++

在一个类中包含两种成员: 数据和函数,分别称为C++数据成员和成员函数. 关于类: 类是C++新增加的重要数据类型,有了类,就就可以实现面向对象程序设计方法中的封装.信息隐蔽.继承.派生.多态等功能. 关于函数的重载 在编程时,有时我们要实现的是同一类的功能,只是有些细节不同.例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数.3个双精度数或3个长整数. 程序设计者往往会分别设计出3个不同名的函数,其函数原型为:int max1(int a int b, int

ImageJ 学习第一篇

ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的ImageJ的开发插件.500多插件可用. 数据类型:8位灰度或索引色,16位无符号整数,32位浮点和RGB色彩. 文件格式:读写所有支持的数据类型为TIFF(非压缩)或原始数据.打开和保存GIF,JPEG,BMP,PNG,PGM,FITS和ASCII.打开DICOM.使用URL打开的TIFF.GIF文件.J

Java图像处理最快技术:ImageJ 学习第一篇

ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的ImageJ的开发插件.500多插件可用. 数据类型:8位灰度或索引色,16位无符号整数,32位浮点和RGB色彩. 文件格式:读写所有支持的数据类型为TIFF(非压缩)或原始数据.打开和保存GIF,JPEG,BMP,PNG,PGM,FITS和ASCII.打开DICOM.使用URL打开的TIFF.GIF文件.J

vue知识总结第一篇vue组件的定义以及父子组件的传值。

vue中是一个.vue结尾的vue文件其中包括<template>标签里边写html,而react是在render函数中..script用来写js,style中用来写css.那么我们来看看vue是怎么写的吧 子组件中 1,用export default 导出子组件,其中标红的是用来父子组件传值的this.$emit('reChild')指发送一个自定事件到父组件中,父组件中只要在引入这个子组件标签的时候v-on:reChild="rece"其中rece为父组件中method

Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署

序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在将Golang的学习点滴记录分享,废话到此,下面进入正文. 注:此文及以后所有内容中的开发平台为:Windows 开发工具为:JetBrains Gogland x64版本 官方下载地址为:https://www.jetbrains.com/go/download/#section=windows

Java学习第一篇---Java入门准备

这是我的第一篇博客,以后也会写自己学习Java的过程.一些知识点.心得体会等,以此鼓励自己坚持学习! 现在开始了我学习Java的生涯:[个人下载的Jdk版本是jdk-8u5-windows-x64] 1.安装之后的目录: ->Source Code: 安装这个选项将会安装Java所有核心类库的源代码 ->bin: 该路径下存放了JDK的各种工具命令,常用的Javac.java等命令. ->db: 该路径是安装Java DB的路径[DB(data base,数据库)是依照某种数据模型组织起

Android基础学习第一篇—Project目录结构

写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正. 2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽. *************************************我只是分割线***************************************

Vue学习~2:Vue实例

Vue 实例的创建 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的 当创建一个 Vue 实例时,你可以传入一个选项对象,指定这个 Vue 实例所管理的元素. 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的.可复用的组件树组成 数据与方法 当一个 Vue 实例被创建时,它将 data 对象中的所有的属性加入到 Vue 的响应式系统中. 当这些属性的值发生改变时,视图将会产生"响应",即匹配更新为新的值. // 我们的数据

Ubuntu学习——第一篇

一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”.“我的存在是因为大家的存在”,是非洲传统的一种价值观. Ubuntu的目标在于为一般用户提供一个最新同时又相当稳定,主要以自由软件建构而成的操作系统.Ubuntu目前具有庞大的社区力量支持,用户可以方便地从社区获得帮助. 二. 安装 ubuntu官方网站: http://www.ubuntu.com/    对应 中

vue学习——刚学Vue组件,吐槽一个东西

Vue组件的props是用来传值的 这里是官方链接 template:"<bbb @click='onClick()'>{{value}}</bbb>", //"<div>{{value}}</div>" 讨厌的东西就出在这行代码,一个组件的 template 调用同级别的组件 bbb 然后使用 props 传值,结果是行不通的,并且没有报错!虽然,明知道是什么问题,可是还是令我感到不舒服. 测试代码: <!DO