vue学习回顾第一天

为什么要学习vue

为什么学习vue.png

什么是mvvm

MVVM.png

vue常用系统指令

vue的使用

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 1引入vue文件-->
    <script src="./vue2.js"></script>
</head>
<body>
<!-- 5使用{{}}展示数据-->
<div id="app">{{message}}</div>
</body>
<script>
    //2创建vue实例
    let vm=new Vue({
         // 3. 通过el属性指定vue实例的监管范围,它的值是一个id
        el:"#app",
        //4 data属性保存数据
        data: {
            message: "hello world"
        }
    })
</script>
</html>

插值表达式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue2.js"></script>
</head>
<body>
<div id="app">
    <!-- 插值表达式的合法用法有:表达式/三元运算符 -->
    <p>表达式</p>
    <p>{{name+"xin"}}</p>
    <p>{{age+3}}</p>
    <p>{{name.split('').reverse().join('')}}</p>
    <h2>三元运算符</h2>
    <p>{{age>18?"已成年":"未成年"}}</p>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:'xhw',
            age:23
        }
    })
</script>
</html>

v-text

<div id="app">
    <!--
       v-text指令也可以用来渲染文本 凡是以v-开头的就是指令,指令的功能就是增强html标签的功能
       使用:在标签属性位置写上v-text="属性名"

       和插值表达式使用区别:
         插值表达式写在标签的innerHTML位置,而v-text写在标签属性位置,平时推荐使用{{}}
      -->
    <div v-text="name"></div>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:'xhw'
        }
    })
</script>

v-html

<body>
<div id="app">
    <!-- v-html可以用来渲染带标签的文本 -->
    <!-- 在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击。只在可信内容上使用 v-html,永不用在用户提交的内容上。 -->
    <div v-html="name"></div>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:"<h1>xhw</h1>"
        }
    })
</script>

v-bind

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue2.js"></script>
    <style>
        .red-font{
            color: red;
        }
    </style>
</head>
<body>
<div id="app">
    <!-- v-bind阔以用来动态绑定属性 使用方式 v-bind:属性名=“data里面的属性” -->
    <img v-bind:src="img">
    <!-- 简写-->
    <img :src="img">

    <a :href="'del.php?id='+id">删除</a>
    <!-- v-bind阔以想绑什么属性,就绑什么属性,这种绑定在后面组件开发的时候很常用 -->
    <p :name="name">测试属性绑定</p>
    <!-- v-bind 动态绑定样式-->
    <p :class="{'red-font': true}">红色字体</p>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:"tom",
            age:'23',
            img:'./avatar.jpg',
            id:2
        }
    })
</script>
</html>

v-for

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue2.js"></script>
</head>
<body>
<!--
       使用v-for渲染数组 和 对象
       v-for能够根据data中数据的变化自动刷新视图

       v-for渲染数组
         1. 在标签的属性位置写上v-for="item in arr" item表示数组中的每一项,这个名字可以随意取,arr表示需要遍历的数组
         2. 在标签的属性位置写上v-for="(item, index) in arr" index表示数组项的索引值
       v-for渲染对象
         1. 在标签的属性位置写上v-for="value in obj" value表示对象键的值,这个名字可以随便取,obj表示需要遍历的对象
         2. 在标签的属性位置写上v-for="(value, key, index) in obj" key表示对象的键

         注意,以下两种情况不会触发视图更新
           1. 当使用数组的length属性去改变数组的时候,不会触发视图更新
           2. 使用数组下标的方式去改变数组的时候,也不会触发视图更新

         解决上述问题:
           1. 使用Vue.set(arr, index, newVal) arr是需要改变的数组,index是数组里面的项, newVal是改变后的值
           2. Array.prototype.splice()

           注意 v-for必须结合key属性来使用,它会唯一标识数组中的每一项,未来当数组中的那一项改变的时候,它会只更新那一项,好处就是提升性能。注意key的值唯一,不能重复
     -->
<div id="app">
    <p v-for="people in user ":key="people.name">{{people.name}}-{{people.age}}</p>
    <p v-for="(item,index) in user " :key="item.name">{{item.name}}:{{item.age}}--{{index}}</p>
    <p v-for="value,key in animal " :key="value">{{value}}</p>
    <p v-for="value ,key ,index in animal" :key="value">{{value}}:{{key}}--{{index}}</p>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            user:[
                {name:'tom',age:22},
                {name:'yagd',age:7}
            ],
            animal:{
                name:'aaa',
                age:12
            }
        }
    })
</script>
</html>

v-model

<body>
<div id="app">
    <!-- v-model指令用来双向数据绑定:就是model和view中的值进行同步变化 -->
    <!-- v-model只能在input/textarea/selet -->
    <input type="text" v-model="name">
    <p>你输入的内容是:{{name}}</p>
</div>
</body>
<script >
    let vm = new Vue({
        el:"#app",
        data:{
            name:''
        }
    })
</script>

v-on

<body>
<!--
       v-on指令用来监听dom事件
       使用方法:
         1. 在标签的属性位置写上v-on:任意的事件类型="执行的函数"
         2. 简写:@任意的事件类型="执行的函数" (推荐)
         3. 通过执行函数添加参数
         4. 通过执行函数中添加$event参数传递事件对象,注意只能是$event,并且不能加引号
         5. 事件修饰符可以给事件添加特殊功能 .stop .prevent
         6. 可以给和按键相关的事件添加按键修饰符 常用的有 .enter
      -->
<div id="app">
    <h1>yourname:{{name}}</h1>
    <button v-on:click="changeMsg">点击改变姓名</button>
    <!-- 简写-->
    <button @click="changeMsg">简写改变</button>
    <button @click="changeMsgbytags('niubi')">传参改变</button>
    <button @click="getEvent($event)">事件</button>
    <!-- 阻止默认事件的执行-->
    <a href="http://www.baidu.com" @click.prevent="changeMsg">跳转</a>
    <!-- 按键修饰符-->
    <input v-on:keyup.13="submit">
    <input v-on:keyup.enter="submit">
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:'tom'
        },
        methods:{
            changeMsg(){
                this.name='hhhh'
            },
            changeMsgbytags(arg){
                this.name=arg
            },
            //事件
            getEvent(e){
               console.log(e);
            },
            submit(){
                console.log('submit');
            }
        }
    })
</script>

v-if和v-show

<body>
<!-- v-if和v-show指令可以用来控制元素的显示和隐藏 v-if="布尔值" v-show="布尔值" 布尔值为true元素显示,false隐藏 -->
<!-- 区别:
    v-if通过控制dom来控制元素的显示和隐藏
    v-show通过控制样式display:none来控制元素的显示与隐藏
    使用场景区别
    1. 涉及到大量dom操作的时候,我们需要使用v-show
    2. 涉及到异步数据渲染的时候就要使用v-if
 -->
<div id="app">
    <h1>v-if</h1>
    <p v-if="isVisiable">aaa</p>
    <h1>v-show</h1>
    <p v-if="isVisiable">bbb</p>
    <button @click="isVisiable=!isVisiable">显示/隐藏</button>

    <div v-if="age >18">已成年</div>
    <div v-else-if="age >6">少年</div>
    <div v-else>儿童</div>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            isVisiable:'true',
            age:20
        },
        methods:{
            change(){
                this.isVisiable=false
            }
    }
    })
</script>

v-cloak

    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue2.js"></script>
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>
<div id="app">
    <!-- 1. 给闪烁的元素加上v-cloak指令 -->
    <!-- 当vue实例结束编译之后(vue文件加载完成之后), v-cloak会被删除-->
    <p v-cloak>{{msg}}</p>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
        msg:'hello'
        }
    })
</script>

案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue2.js"></script>
    <style>
        #app {
            width: 600px;
            margin: 10px auto;
        }

        .tb {
            border-collapse: collapse;
            width: 100%;
        }

        .tb th {
            background-color: #0094ff;
            color: white;
        }

        .tb td,
        .tb th {
            padding: 5px;
            border: 1px solid black;
            text-align: center;
        }

        .add {
            padding: 5px;
            border: 1px solid black;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
<div id="app">
    <div class="add">
        编号:
        <input type="text" v-model="newId"> 品牌名称:
        <input type="text" v-model="newName">
        <input type="button" value="添加" @click="addData">
    </div>

    <div class="add">
        品牌名称:
        <input type="text" placeholder="请输入搜索条件">
    </div>

    <div>
        <table class="tb">
            <tr>
                <th>编号</th>
                <th>品牌名称</th>
                <th>创立时间</th>
                <th>操作</th>
            </tr>
            <tr v-for="(item, index) in list" :key="index">
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
                <td>{{item.ctime}}</td>
                <td>
                    <!-- 将index作为参数传入 -->
                    <a href="#" @click="delete(index)">删除</a>
                </td>
            </tr>
            <tr v-if="list.length === 0">
                <td colspan="4">没有品牌数据</td>
            </tr>
            <!-- 动态生成内容tr -->
        </table>
    </div>
</div>
</body>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            newId:'',
            newName:'',
            list:[
                {id: 1, name: 'CC', ctime: new Date()},
                {id: 2, name: 'LV', ctime: new Date()},
                {id: 3, name: 'AA', ctime: new Date()},
            ],
            methods:{
                addData(){
                    this.list.push({id:this.newId,name:this.newName,ctime:new Date()})
                },
                delete(idx){
                    this.list.splice(idx,1)
                }
            }

        }
    })
</script>
</html>

推荐阅读更多精彩内容

  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 5,845评论 0 25
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 2,893评论 0 3
  • 你不该成为这样的人, 对所有人客气, 不见了内心的风骚和骄傲; 对父母讲道理, 让他们在你面前像个孩子; 对别人莫...
    三亏束负阅读 83评论 1 1
  • 当活生生的人 用冰冷的墓碑替代着 你想表达的 只能隔着不同世界的时空 用尽全身力气撕裂般呼唤 却没有一丝回应 谢谢...
    欧阳竹凌阅读 213评论 0 0
  • 黑夜是你的眉眼 在眨眼间变成了黎明 黎明在你的唇角 微微一扬便成了白迹 风吹着树叶簌簌作响 间或响起知了夏终的悲歌...
    木子菲橘阅读 254评论 5 7