VueJS 学习笔记 day - 01

以下笔记中的部分代码以及文字说明来自黑马程序员视频
只用作个人学习使用
有错误的地方请私信指出
如有侵权请联系删除

VueJS 学习笔记 day - 01

第一个Vue程序

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>HelloWorld - VUE</title>
    </head>
    <body>
        <div id="hello">
            {{message}}
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el:'#hello',
                data:{
                    message:'Hello World'
                }
            })
        </script>
    </body>
</html>

在这种vue程序中,所有的东西都是响应式的,打开浏览器的JavaScript 控制台,并修改app.message 的值,会看到浏览器中显示的内容会有相应的更新

app.message=‘WangXuzhi’

常见问题

v-cloak 与 v-text 指令

可以用于解决插值表达式刷新闪烁的问题

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>v-cloak 解决插值表达式闪烁问题</title>
        <style>
            [v-cloak]{
                display: none;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <p v-cloak>{{ msg }}</p>
            <!--默认情况下,v-text是不会有刷新闪烁问题  -->
			<!--v-text会覆盖原本标签中的内容,而插值表达式只会修改插值表达式本身的值,例如-->
			<p v-cloak>===============》 {{ msg }}</p>
			<h4 v-text="msg">==============》 </h4>
        </div>
        <script src="js/vue-2.4.0.js"></script>
        <script type="text/javascript">
            var vm = new Vue({
                el:'#app',
                data:{
                    msg:'v-cloak 解决插值表达式问题'
                }
            })
        </script>

    </body>
</html>

v-html

在将data中的数据渲染到HTML中时,将data中的数据以html的格式进行渲染,

如果使用 插值表达式 或者 v-text 指令进行渲染,则会将msg中的html标签以纯文本的形式进行渲染

<script type="text/javascript">
    var vm = new Vue({
        el:'#app',
        data:{
            msg:'<h1>这是一个h1标签</h1>'
        }
    })
</script>

v-bind

绑定指令,可以将某些标签中的属性绑定到 data 数据中

v-bind 指令可以简写为 : => v-bind:title == :title

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>v-bind指令的学习</title>
    </head>
    <body>

        <div id="app">
            <!-- v-bind 指令是绑定指令
            在本例中,将 data 中的 title 值绑定到 button 中的 title 属性中
            注:绑定时,button 中的 title 属性的的内容必须与 data 中的 属性名相同才可以成功绑定
            vue将绑定的title中的属性名当做一个表达式,即mytitle是一个表达式,可以通过  + 号进行字			符串的拼接
            -->
            <button v-bind:title="mytitle" >将鼠标指向我</button>
            <button v-bind:title="mytitle + '对我进行了拼接'" >将鼠标指向我</button>
        </div>


        <script type="text/javascript" src="js/vue-2.4.0.js" ></script>
        <script type="text/javascript">
            var vm = new Vue({
                el:'#app',
                data:{
                    mytitle:'我是用vue渲染出来的'
                }
            })
        </script>
    </body>
</html>

v-on

v-on 指令用于绑定事件

v-bind 指令可以简写为 : => v-on:click == @title

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>v-on事件绑定</title>
    </head>
    <body>
        <div id="app">
            <!-- 单击调用 methods 中的 show 方法 -->
            <button v-on:click="show">点我有惊喜</button>
        </div>
        
        <script type="text/javascript" src="js/vue-2.4.0.js" ></script>
        <script type="text/javascript">
            var vm = new Vue({
                el:'#app',
                <!-- html中调用的所有方法都写在这里面 -->
                methods:{
                    show:function(){
                        alert('我就是惊喜');
                    }
                }
            })
        </script>
    </body>
</html>

走马灯效果实践

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>走马灯效果</title>
    </head>
    <body>
        <div id="app">
            <button @click="dong">走起来</button>
            <button @click="stop">停止</button>
            <h2>{{ msg }}</h2>
        </div>


        <script type="text/javascript" src="js/vue-2.4.0.js" ></script>
        <script>
            var vm = new Vue({
                el:'#app',
                data:{
                    msg:'我是走马灯----!!!',
                    intervalId:null
                },
                methods:{
                    dong(){

                        if(this.intervalId != null) return;

                        this.intervalId = setInterval(() => {
                            var start = this.msg.substring(0,1);
                            var end = this.msg.substring(1);
                            this.msg = end + start;
                        },40)
                    },
                    stop(){
                        clearInterval(this.intervalId);
                        this.intervalId = null;
                    }
                }
            })

        </script>
    </body>
</html>

事件修饰符

  • .stop 阻止冒泡
  • .prevent 阻止默认事件
  • .capture 添加事件侦听器时使用事件捕获模式
  • .self 只当事件在该元素本身(比如不是子元素)触发时触发回调
  • .once 事件只触发一次
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
  <style>
    .inner {
      height: 150px;
      background-color: darkcyan;
    }

    .outer {
      padding: 40px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div id="app">

    <!-- 使用  .stop  阻止冒泡 -->
    <!-- <div class="inner" @click="div1Handler">
      <input type="button" value="戳他" @click.stop="btnHandler">
    </div> -->

    <!-- 使用 .prevent 阻止默认行为 -->
    <!-- <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a> -->

    <!-- 使用  .capture 实现捕获触发事件的机制 -->
    <!-- <div class="inner" @click.capture="div1Handler">
      <input type="button" value="戳他" @click="btnHandler">
    </div> -->

    <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
    <!-- <div class="inner" @click="div1Handler">
      <input type="button" value="戳他" @click="btnHandler">
    </div> -->

    <!-- 使用 .once 只触发一次事件处理函数 -->
    <!-- <a href="http://www.baidu.com" @click.prevent.once="linkClick">有问题,先去百度</a> -->


    <!-- 演示: .stop 和 .self 的区别 -->
    <!-- <div class="outer" @click="div2Handler">
      <div class="inner" @click="div1Handler">
        <input type="button" value="戳他" @click.stop="btnHandler">
      </div>
    </div> -->

    <!-- .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为 -->
    <!-- <div class="outer" @click="div2Handler">
      <div class="inner" @click.self="div1Handler">
        <input type="button" value="戳他" @click="btnHandler">
      </div>
    </div> -->

  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {
        div1Handler() {
          console.log('这是触发了 inner div 的点击事件')
        },
        btnHandler() {
          console.log('这是触发了 btn 按钮 的点击事件')
        },
        linkClick() {
          console.log('触发了连接的点击事件')
        },
        div2Handler() {
          console.log('这是触发了 outer div 的点击事件')
        }
      }
    });
  </script>
</body>

</html>

v-model

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <h4>{{ msg }}</h4>

    <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定  -->
    <!-- <input type="text" v-bind:value="msg" style="width:100%;"> -->

    <!-- 使用  v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定 -->
    <!-- 注意: v-model 只能运用在 表单元素中 -->
    <!-- input(radio, text, address, email....)   select    checkbox   textarea   -->
    <input type="text" style="width:100%;" v-model="msg">
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '大家都是好学生,爱敲代码,爱学习,爱思考,简直是完美,没瑕疵!'
      },
      methods: {
      }
    });
  </script>
</body>

</html>

v-model 案例 =》简易计算器

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">
            <input type="text" v-model="n1">

            <select v-model="opt">
                <option value="+">+</option>
                <option value="-">-</option>
                <option value="*">*</option>
                <option value="/">/</option>
            </select>

            <input type="text" v-model="n2">

            <input type="button" value="=" @click="calc">

            <input type="text" v-model="result">
        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    n1: 0,
                    n2: 0,
                    result: 0,
                    opt: '+'
                },
                methods: {
                    calc() { // 计算器算数的方法  
                        // 逻辑:
                        /* switch (this.opt) {
            case '+':
              this.result = parseInt(this.n1) + parseInt(this.n2)
              break;
            case '-':
              this.result = parseInt(this.n1) - parseInt(this.n2)
              break;
            case '*':
              this.result = parseInt(this.n1) * parseInt(this.n2)
              break;
            case '/':
              this.result = parseInt(this.n1) / parseInt(this.n2)
              break;
          } */

                        // 注意:这是投机取巧的方式,正式开发中,尽量少用
                        var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
                        this.result = eval(codeStr)
                    }
                }
            });
        </script>
    </body>

</html>

Vue中的样式

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
        <style>
            .red {
                color: red;
            }

            .thin {
                font-weight: 200;
            }

            .italic {
                font-style: italic;
            }

            .active {
                letter-spacing: 0.5em;
            }
        </style>
    </head>

    <body>
        <div id="app">
            <!-- <h1 class="red thin">这是一个很大很大的H1,大到你无法想象!!!</h1> -->

            <!-- 第一种使用方式,直接传递一个数组,注意: 这里的 class 需要使用  v-bind 做数据绑定 -->
            <!-- <h1 :class="['thin', 'italic']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->

            <!-- 在数组中使用三元表达式 -->
            <!-- <h1 :class="['thin', 'italic', flag?'active':'']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->

            <!-- 在数组中使用 对象来代替三元表达式,提高代码的可读性 -->
            <!-- <h1 :class="['thin', 'italic', {'active':flag} ]">这是一个很大很大的H1,大到你无法想象!!!</h1> -->

            <!-- 在为 class 使用 v-bind 绑定 对象的时候,对象的属性是类名,由于 对象的属性可带引号,也可不带引号,所以 这里我没写引号;  属性的值 是一个标识符 -->
            <h1 :class="classObj">这是一个很大很大的H1,大到你无法想象!!!</h1>


        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    flag: true,
                    classObj: { red: true, thin: true, italic: false, active: false }
                },
                methods: {}
            });
        </script>
    </body>

</html>

vue中的内联样式

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">
            <!-- 对象就是无序键值对的集合 -->
            <!-- <h1 :style="styleObj1">这是一个h1</h1> -->

            <h1 :style="[ styleObj1, styleObj2 ]">这是一个h1</h1>
        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    styleObj1: { color: 'red', 'font-weight': 200 },
                    styleObj2: { 'font-style': 'italic' }
                },
                methods: {}
            });
        </script>
    </body>

</html>

v-for

循环普通数组

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">
            <!-- <p>{{list[0]}}</p>
                    <p>{{list[1]}}</p>
                    <p>{{list[2]}}</p>
                    <p>{{list[3]}}</p>
                    <p>{{list[4]}}</p> -->

            <p v-for="(item, i) in list">索引值:{{i}} --- 每一项:{{item}}</p>

        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    list: [1, 2, 3, 4, 5, 6]
                },
                methods: {}
            });
        </script>
    </body>

</html>

循环对象数组

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">
            <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>
        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    list: [
                        { id: 1, name: 'zs1' },
                        { id: 2, name: 'zs2' },
                        { id: 3, name: 'zs3' },
                        { id: 4, name: 'zs4' }
                    ]
                },
                methods: {}
            });
        </script>
    </body>

</html>

循环对象

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">
            <!-- 注意:在遍历对象身上的键值对的时候, 除了 有  val  key  ,在第三个位置还有 一个 索					引  -->
            <p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p>
        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    user: {
                        id: 1,
                        name: '托尼·屎大颗',
                        gender: '男'
                    }
                },
                methods: {}
            });
        </script>
    </body>

</html>

循环迭代数字

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <!-- in 后面我们放过  普通数组,对象数组,对象, 还可以放数字 -->
    <!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始 -->
    <p v-for="count in 10">这是第 {{ count }} 次循环</p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {}
    });
  </script>
</body>

</html>

循环中key的使用

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">

            <div>
                <label>Id:
                    <input type="text" v-model="id">
                </label>

                <label>Name:
                    <input type="text" v-model="name">
                </label>

                <input type="button" value="添加" @click="add">
            </div>

            <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string -->
            <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
            <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使				用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
            <p v-for="item in list" :key="item.id">
                <input type="checkbox">{{item.id}} --- {{item.name}}
            </p>
        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    id: '',
                    name: '',
                    list: [
                        { id: 1, name: '李斯' },
                        { id: 2, name: '嬴政' },
                        { id: 3, name: '赵高' },
                        { id: 4, name: '韩非' },
                        { id: 5, name: '荀子' }
                    ]
                },
                methods: {
                    add() { // 添加方法
                        this.list.unshift({ id: this.id, name: this.name })
                    }
                }
            });
        </script>
    </body>

</html>

v-if 和 v-show

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
    </head>

    <body>
        <div id="app">

            <!-- <input type="button" value="toggle" @click="toggle"> -->
            <input type="button" value="toggle" @click="flag=!flag">

            <!-- v-if 的特点:每次都会重新删除或创建元素 -->
            <!-- v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 -->

            <!-- v-if 有较高的切换性能消耗 -->
            <!-- v-show 有较高的初始渲染消耗 -->

            <!-- 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show -->
            <!-- 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if -->
            <h3 v-if="flag">这是用v-if控制的元素</h3>
            <h3 v-show="flag">这是用v-show控制的元素</h3>

        </div>

        <script>
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {
                    flag: false
                },
                methods: {
                    /* toggle() {
          this.flag = !this.flag
        } */
                }
            });
        </script>
    </body>

</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值