Vue 03

Vue

js的几种循环方式

v-for 可以循环的变量

v-for 可以循环的有:
	数组,对象,字符串,数字

循环各类数据类型的区别

数组:
	 <div v-for="(item,index) in l">第 {{index + 1}}个,值是:{{item}}</div>
    
循环数组可以循环两个,一个是数组的值,一个是数组中数据的索引。循环数组的时候,数据值在前面,索引值在后面

总结:

  • items:要迭代的数组
    item:存储数组元素的变量名
    index:迭代到的当前元素索引,从0开始。
对象:
	 <div v-for="(item,key) in info">key值是:{{key}}-----{{item}}</div>
    v-for="(value,key,index) in object"

循环对象,第一个参数是值,第二个值是对象的键。
循环对象的时候是数据值在前面,建再后面。

总结:

  • value,对象的值
    key, 对象的键
    index, 索引,从0开始
字符串:
	<div v-for="(item,index) in s">
            <p v-if="item!=' '">{{item}}---->索引是:{{index}}</p>
            <br v-else>
        </div>

        
循环字符串是将字符串一个个字符串拿出来,就算是空格也是会算在其中,但是在界面上空格虽然占据了,一个标签但是由于标签的特性,没有显示出来,所以就在上面的例子中,加了一个if判断和br 标签进行分别。
循环的参数第一个是值,第二个是索引,索引的范围是连空格都都会算在其中。
数字:
    <div v-for="(item,index) in 8">{{item}}----索引是:{{index}}</div>
    
循环数字,不需要像python一样需要加上range,直接就能循环,循环的两个值,第一个是循环出来的值,第二是索引。

js的循环方式

  • 在js中的循环都是基于索引的循环,python中都是基于迭代的循环

第一种基于索引的循环

var a = [4, 5, 6, 7]

    for (i = 0; i < a.length; i++) {
        console.log(i)  # 打印的是索引
        // console.log(a[i])  # 这里打印的是值
    }

第二种js基于循环

拿到的是索引,跟vue的v-for区分
	var a = [4, 5, 6, 7]
	 for(i in a){
        console.log(i)  //索引
        console.log(a[i])  // 值
    }

第三种 es6 语法 for 循环

  var a = [4, 5, 6, 7]
    for (item of a) {
        console.log(item)  // 值
    }

第四中 数组的方法, forEach 循环

    var a=[4,5,6,7]
    a.forEach(function (item) {
         console.log('----',item)
        })

第五种 jQuery的循环 ,循环数组,对象

    var a = [4, 5, 6, 7]
    $.each(a, function (index, item) {
        console.log(index) //索引
        console.log(item) // 值

    })

key值的解释

** :key 一般配合v-for一起使用. 用来在特定情况下, 保证被遍历的数组中的元素的顺序.**

vue de v-for 指令写在标签上,在标签上加上一个key,用属性指令绑定一个变量,key的值每次都不一样,这样可以加速虚拟DOM的替换,从而提高循环的效率,而且key的值必须是唯一

例:
	 <div v-for="item in 8" :key="item">{{item}}</div>
    
 说明:
	当我们运行上面的选这个标签,会在界面上寻安然出标签中的值,但是当我们在标签中插入一个值,那后台就会在调用执行DOM,再次执行循环,并且将数据加入到,渲染的标签页面上,但是当我们在标签中加上绑定的key值,就只会在原来的基础上加上这个标签数据,所以绑定的key一般使用的都是数据的索引值。
    
以后我们在写标签的时候尽量还是加上key
<div id="app">
    <button @click="add">添加</button>
    <ul>
        <li v-for="name in list">
            <input type="checkbox"> {{name}}
        </li>
    </ul>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            list: ["孙悟空", "猪八戒", "沙和尚"]
        },
        methods: {
            add() {
                //注意这里是unshift,向数组的头部添加一个元素
                this.list.unshift("唐僧");
            }
        }
    });
</script>

在这里插入图片描述

解决方案:

<div id="app">
    <button @click="add">添加</button>
    <ul>
        <!-- 添加:key即可. 注意,key中的值必须是唯一且不会改变的值-->
        <li v-for="name in list" :key="name">
            <input type="checkbox"> {{name}}
        </li>
    </ul>
</div>

数组,对象的检测和更新

在运行HTML页面的时候,我们进行一些数据的修改,但是会发现,后台的数据已经被修改掉了,但是页面却没有实时渲染出来,我们可以使用下面的方法将设置一下即可:
	Vue.set(this.info, 'hobby', '篮球')
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div>
    <div class="app">

        <h1>循环对象</h1>
        <div v-for="(value,key) in info">
            <h3>key值是:{{key}}</h3>
            <h2>value是:{{value}}</h2>
            <hr>
        </div>
        <button @click="handleAdd">点我,加数据</button>


    </div>

</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            info: {name: 'lqz', age: 19},
        },
        methods: {
            handleAdd() {
                // 页面会变化
                // this.info['name'] = '彭于晏'
                // 页面不会变,单是值有了
                // this.info['hobby'] = '篮球'

                // 遇到数据变了,页面没变的情况,都是用
                Vue.set(this.info, 'hobby', '篮球')

            }
        },
    })
</script>
</html>

input 事件

# input 的事件:
	click 点击事件
    input 当输入框进行输入的时候,会触发
    change 当元素的值发生变化时,触发
    blur   当输入框失去焦点的时候,触发
    focus  当获的焦点的时候,触发
 <div class="app">
        <h1>点击事件click</h1>
        <input type="text" @click="handleClick">

        <h1>失去焦点</h1>
        <input type="text" @blur="handleBlur">

        <h1>input事件,只要输入,就会触发</h1>
        <input type="text" @input="handleInput">

        <h1>change事件</h1>
        <input type="text" @change="handleChange">

        <h1>focus事件</h1>
        <input type="text" @focus="handleFocus">
    </div>

v-model 的双向数据绑定

概述:
  • Vue的双向绑定的实现:数据发生变化,页面就会自动刷新,页面发生变化的时候,数据也会跟着自动发生变化

注意:

  • 双像绑定,只能绑定文本框,单选按钮,复选框,文本域,下拉列表。。
<div id="app">
    用户名: <input type="text" v-model="username"/>
    

        <h1>单向数据绑定</h1>
       名字: <input type="text" :value="name">---->{{name}}--->单向数据绑定

<script type="text/javascript">
    var app = new Vue({
        el:"#app",
        data:{
            //该属性值和文本框的value属性值,保持一致
            username:""
        }
    });
</script>

事件修饰符

Vue.js 为v-on 提供了事件修饰符来处理DOM事件细节。

可以通过点(.)表示的指令后缀来调用修饰符。

  • .stop - 阻止冒泡
  • .prevent - 阻止默认事件,(阻止a链接的跳转,可以自定义跳转)
  • .capture - 阻止捕获
  • .self - 只监听触发该元素的事件
  • .once - 只触发一次,
  • .left - 左键事件
  • .right - 右键事件
  • .middle - 中间滚轮事件
<!-- 阻止单击事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联  -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件侦听器时使用事件捕获模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
<div v-on:click.self="doThat">...</div>

<!-- click 事件只能点击一次,2.1.4版本新增 -->
<a v-on:click.once="doThis"></a>
<a href="http://www.baidu.com" @click.prevent="handleA"></a
location.href = 'http://www.cnblogs.com'

按键修饰符

# 按键事件 :当按了某个键盘的键,就会触发函数的执行
 @key='handlekeyUp'
    
 # 按键修饰符:只有在按下某个按键按下才会触发

Vue允许为v-on在监听键盘事件时添加按键修饰符:

# 只有在 keyCode 是 13 时调用 vm.submit() 
	<input v-on:keyup.13="submit">
    
# 记住所有的keyCode还是比较困难的,所以还能使用其他的方法:
	<!-- 缩写语法 -->
<input @keyup.enter="submit">
例子:
	<p><!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>	

表单控制

input表单中有这门几种变量类型:
	text ,radio(单选),CheckBox(单选和多选)
在使用表单控制件元素可以使用v-model创建双向数据绑定,不管单选还是输入的数据,亦或者多选的数据,在进行选定多的时候,v-model会根据控件类型自动选取正确的方法来更新元素。
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div>
    <div class="app">

        <p>用户名:<input type="text" v-model="username"></p>
        <p>密码:<input type="password" v-model="password"></p>
        <p>性别:
            男:<input type="radio" v-model="gender" value="1">
            女:<input type="radio" v-model="gender" value="2">
        </p>
        <p>记住密码:<input type="checkbox" v-model="remember"></p>

        <p>爱好:
            篮球:<input type="checkbox" v-model="hobby" value="篮球">
            足球:<input type="checkbox" v-model="hobby" value="足球">
            排球:<input type="checkbox" v-model="hobby" value="排球">
        </p>

        <button @click="handleClick">登录</button>

    </div>

</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            username: '',
            password: '',
            gender: '',  // radio单选,多个radio绑定同一个变量,选中某个,就对应value值
            remember: false, // checkbox 单选是true或false
            hobby: []  // checkbox 多选是数组类型,必须一开始定义就是数组,多个checkbox绑定一个变量
        },
        methods: {
            handleClick() {
                console.log(this.username, this.password, this.gender, this.remember, this.hobby)
            }
        }

    })
</script>
</html>

过滤案例

使用场景:

  • 可以在进行数据搜索的时候使用
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div>
    <div class="app">
        <h1>过滤案例</h1>
        <p>请输入要搜索的内容:<input type="text" v-model="myText" @input="handleInput"></p>
        <ul>
            <li v-for="item in newDataList">{{item}}</li>
        </ul>

    </div>

</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            myText: '',
            dataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
            newDataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
        },
        methods: {
            handleInput() {
                this.newDataList = this.dataList.filter(
                    item => item.indexOf(this.myText) >= 0
                ) }, }})

补充点:

数组的过滤方法

    var dataList = ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf']
     var newDataList = dataList.filter(function (item) {
         return false  //return true表示这个值保留,false 表示这个值不要
     })
    console.log(newDataList)

字符串的indexOf方法

判断子字符串是否在当前字符串中,如果在返回的是索引,如果不在返回-1
     var s = 'lqz is handsome'
     var s1 = 'qqq'
     var i = s.indexOf(s1)
     console.log(i)

es6 的箭头函数写法

箭头函数的出现主要就是为了解决函数中嵌套函数的时候this的指向问题,箭头函数是没有自己的this的,使用的都是上一级的this
箭头函数的几种写法:
1. 无参数,没有返回值的箭头函数
var f=()=>{
   console.log('函数')
}

2.有一个参数,没有返回值的箭头函数,括号可以去掉(也可以加)
var f = item => {
    console.log(item)
}

3.有多个参数,没有返回值的箭头函数,括号不能去掉
var f = (item, key) => {
    console.log(item)
}

4.有一个参数,一个返回值
var f =  (item)=> {
    return item + 'lqz'
}

5.简写方式
var f = item => item + '小明'

    var res = f('小红')
    console.log(res)

posted @ 2023-02-15 17:27  亓官扶苏  阅读(21)  评论(0)    收藏  举报