VUE学习一:初识VUE、指令、动态绑定、计算属性

简介: 这篇文章主要介绍了Vue.js的基础知识,包括初识Vue、指令如v-for、v-on的使用、动态属性绑定(v-bind)、计算属性等概念与实践示例。

导言

一、01-初体验

1. ch01_helloworld.html

vue 的第一个hello world。

  • 元素 js 的做法(编程范式:命令式编程
    1. 创建div元素,设置 id 属性
    2. 定义一个变量叫 message
    3. 将message变量(通过插值表达式)放在前面的div元素中显示
    4. 修改message的数据:今天天气不错
    5. 将修改后的数据再次替换到div元素
  • 知识点:
    1. let(变量) const(常量)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello vue</title>
    <script src="../../lib/vue.js"></script>
</head>
<body>
<div id="app">{
  { message }}</div>
</body>
<script>
    // let(变量) const(常量)
    // 编程范式:声明式编程
    const app = new Vue({
        el: '#app', // 用于挂载要管理的元素
        data: {     // 定义数据
            message: 'Hello Vue!'
        }
    })
</script>
</html>

2. v-for指令:ch02_vue列表展示_v-for.html

v-for指令:循环遍历。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue列表展示</title>
    <script src="../../lib/vue.js"></script>
</head>
<body>
<div id="app">
    <ul>
        <li>{
  {movies[0]}}</li>
        <li>{
  {movies[1]}}</li>
        <li>{
  {movies[2]}}</li>
        <li>{
  {movies[3]}}</li>
    </ul>
    <br>
    <ul>
        <li v-for="item in movies" >{
  {item}}</li>
    </ul>
</div>
</body>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            message: '你好啊',
            movies: ['星际穿越', '大话西游', '少年派', '盗梦空间']
        }
    })
</script>
</html>

3. v-on指令:ch03.1_vue案例_计数器_v-on.html

  1. v-on指令:点击指令,等价于 @
  2. 可以直接写函数内容,也可以直接写函数名
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue案列-计数器</title>
    <script src="../../lib/vue.js"></script>
</head>
<body>
<div id="app">
    <h2>当前技术: {
  {counter}}</h2>
    <!-- v-on指令 等价于 @-->
   <button v-on:click="counter++">+</button>
   <button @click="counter--">-</button>

   <button v-on:click="counter++">+</button>
   <button @click="counter--">-</button>

    <button v-on:click="add">+</button>
    <button v-on:click="subtract">-</button>
</div>
</body>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            counter: 0
        },
        methods: {
            add: function () {
                this.counter++;
                console.log('add 被执行')

            },
            subtract: function () {
                this.counter--;
                console.log('subtract 被执行')
            }
        }
    })
</script>
</html>

4. 介绍MVVM、方法 和 函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
MVVM: vue就是一个MVVM框架, M:model 就是 data里的数据,v: view 就是 HTML代码, VM :就是vue实例

开发中什么时候称之为方法,什么时候称之为函数呢?
方法:method
函数:function

js 中 定义 function abs(){} 为 函数
js 在 在定义类中 function Person{} 中定义的为 方法
一般  方法 是和某个实例对象挂钩的。

有时候 方法和函数也是等价的。

所以:
methods 中定义的 是方法

-->
</body>
</html>

5. ch04_template.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>template</title>
</head>
<body>
<div id="app"></div>
</body>
<script src="../../lib/vue.js"></script>
<script>
    const app = new Vue({
        el: '#app',
        data: {

        },
        methods: {

        }
    })
</script>"
</html>

二、02-插值表达式、指令

1. { {}}:01-Mustache语法-插值表达式.html

mustache语法中,不仅仅可以直接写变量,也可以写简单的表达式

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Mustache 插值表达式</title>
</head>
<body>
<div id="app">
  <h2>{
  {message}}</h2>
  <h2>{
  {message}}, 李银河!</h2>

  <!--mustache语法中,不仅仅可以直接写变量,也可以写简单的表达式-->
  <h2>{
  {firstName + lastName}}</h2>
  <h2>{
  {firstName + ' ' + lastName}}</h2>
  <h2>{
  {firstName}} {
  {lastName}}</h2>
  <h2>{
  {counter * 2}}</h2>
</div>
</body>
<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      firstName: 'kobe',
      lastName: 'bryant',
      counter: 100
    },
    methods: {

    }
  })
</script>
</html>

2. v-html指令:02-v-once指令.html

当在浏览器开发者工具的 console 控制台,输入 app.message='哈哈哈', 上面改变,下面不改变

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-on</title>
</head>
<body>
<div id="app">
  <h2>{
  {message}}</h2>
  <!--当在浏览器开发者工具的 console 控制台,输入 app.message='哈哈哈', 上面改变,下面不改变-->
  <h2 v-once>{
  {message}}</h2>
</div>
</body>
<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    methods: {

    }
  })
</script>
</html>

3. v-html指令:03-v-html指令.html

插入 html 片段

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-html</title>
</head>
<body>

<div id="app">
  <h2>{
  {url}}</h2>
  <h2 v-html="url"></h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      url: '<a href="http://www.baidu.com">百度一下</a>'
    }
  })
</script>

</body>
</html>

4. v-text指令:04-v-text指令.html

输出文本

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-text</title>
</head>
<body>

<div id="app">
  <h2>{
  {message}}, 李银河!</h2>
  <h2 v-text="message">, 李银河!</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    }
  })
</script>

</body>
</html>

5. v-pre指令:05-v-pre指令.html

展示死数据,是啥就显示啥

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-pre</title>
</head>
<body>

<div id="app">
  <h2>{
  {message}}</h2>
  <!--直接显示 内容,不取model 里面的数据:{
  {message}}-->
  <h2 v-pre>{
  {message}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    }
  })
</script>

</body>
</html>

6. v-cloak指令:06-v-cloak指令.html

v-cloak作用:

  • 如果不加的话,如js中延迟一秒(模拟网络延迟),则会先显示 { {message}} 一秒钟,然后显示:你好啊,
  • 如果加了 v-cloak,并加上上面的 样式,则一秒内什么都不显示,一秒后显示:你好啊
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-cloak</title>
  <style>
    [v-cloak] {
      display: none;
    }
  </style>
</head>
<body>
<!--v-cloak作用:
    如果不加的话,如js中延迟一秒(模拟网络延迟),则会先显示 {
  {message}} 一秒钟,然后显示:你好啊,
    如果加了 v-cloak,并加上上面的 样式,则一秒内什么都不显示,一秒后显示:你好啊-->
<div id="app" v-cloak>
  <h2>{
  {message}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  // 在vue解析之前, div中有一个属性v-cloak
  // 在vue解析之后, div中没有一个属性v-cloak
  setTimeout(function () {
    const app = new Vue({
      el: '#app',
      data: {
        message: '你好啊'
      }
    })
  }, 1000)
</script>

</body>
</html>

三、v-bind指令:03-动态绑定属性

1. 01-v-bind的基本使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-bind 和 冒号</title>
</head>
<body>

<div id="app">
  <!-- 错误的做法: 这里不可以使用mustache语法-->
  <!--<image src="{
  {imgURL}}" alt="">-->

  <!-- 正确的做法: 使用v-bind指令 -->
  <img v-bind:src="imgURL" alt="" ></img>
  <a v-bind:href="aHref">百度一下</a>

  <br>

  <!--语法糖的写法-->
  <img :src="imgURL" alt="" ></img>
  <a :href="aHref">百度一下</a>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      imgURL: 'https://img11.360buyimg.com/mobilecms/s350x250_jfs/t1/20559/1/1424/73138/5c125595E3cbaa3c8/74fc2f84e53a9c23.jpg!q90!cc_350x250.webp',
      aHref: 'http://www.baidu.com'
    }
  })
</script>

</body>
</html>

2. 02-v-bind动态绑定class(对象语法).html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-bind动态绑定class(对象语法)</title>

  <style>
    .active {
      color: red;
    }
  </style>
</head>
<body>

<div id="app">
  <h1>这两个普通写法</h1>
  <h2 class="active">{
  {message}}</h2>
  <h2 :class="active">{
  {message}}</h2>

  <h1>对象的形式 写入</h1>
  <!-- <h2 v-bind:class="{key1: value1, key2: value2}">{
  {message}}</h2> -->
  <!-- <h2 v-bind:class="{类名1: true, 类名2: boolean}">{
  {message}}</h2> -->
  <h2 class="title" v-bind:class="{active: isActive, line: isLine}">{
  {message}}</h2>
  <h2 class="title" v-bind:class="getClasses()">{
  {message}}</h2>

  <button v-on:click="btnClick">按钮</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      isActive: true,
      isLine: true
    },
    methods: {
      btnClick: function () {
        this.isActive = !this.isActive
      },
      getClasses: function () {
        return {active: this.isActive, line: this.isLine}
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

3. 03-v-bind动态绑定class(数组语法).html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-bind动态绑定class(数组语法)</title>
  <style>
    .aaaaaa {
      color: red;
    }
    .bbbbbbb {
      font-size: 50px;
    }
  </style>
</head>
<body>

<div id="app">
  <h2 class="title" :class="[active, line]">{
  {message}}</h2>
  <h2 class="title" :class="getClasses()">{
  {message}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      active: 'aaaaaa',
      line: 'bbbbbbb'
    },
    methods: {
      getClasses: function () {
        return [this.active, this.line]
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

4. 04-作业(v-for和v-bind的结合).html

作业需求: 点击列表中的哪一项, 那么该项的文字变成红色

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>作业(v-for和v-bind的结合)</title>

  <style>
    .active{
      color: red;
    }
  </style>
</head>
<body>
<h1>作业需求: 点击列表中的哪一项, 那么该项的文字变成红色</h1>
<div id="app">
  <ul>
    <!--<li v-for="m in movies">{
  {m}}</li>-->
    <li v-for="(m, index) in movies" @click="change(index)" :class="{active: currentIndex === index}">
      {
  {index}}-{
  {m}}
    </li>
  </ul>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      movies: ['海王', '海尔兄弟', '火影忍者', '进击的巨人'],
      currentIndex: 0
    },
    methods: {
      change: function (index) {
        this.currentIndex = index
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

5. 05-v-bind动态绑定style(对象语法).html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-bind动态绑定style(对象语法)</title>
</head>
<body>

<div id="app">
  <!--<h2 :style="{key(属性名): value(属性值)}">{
  {message}}</h2>-->

  <!--'50px'必须加上单引号, 否则是当做一个变量去解析-->
  <h2 :style="{fontSize: '50px'}">{
  {message}}</h2>

  <!--finalSize当成一个变量使用-->
  <h2 :style="{fontSize: finalSize}">{
  {message}}</h2>
  <h2 :style="{fontSize: finalSize + 'px', backgroundColor: finalColor}">{
  {message}}</h2>
  <h2 :style="getStyles()">{
  {message}}</h2>
</div>

</body>
<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      finalSize: 100,
      finalColor: 'red',
    },
    methods: {
      getStyles: function () {
        return {fontSize: this.finalSize + 'px', backgroundColor: this.finalColor}
      }
    }
  })
</script>
</html>

在这里插入图片描述

6. 06-v-bind动态绑定style(数组语法).html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>bind动态绑定style(数组语法)</title>
</head>
<body>

<div id="app">
  <h2 :style="[baseStyle, baseStyle1]">{
  {message}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      baseStyle: {backgroundColor: 'red'},
      baseStyle1: {fontSize: '100px'},
    }
  })
</script>

</body>
</html>

在这里插入图片描述

四、computed属性:04-计算属性

1. 01-计算属性的基本使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01-计算属性的基本使用</title>
</head>
<body>

<div id="app">
  <h2>{
  {firstName + ' ' + lastName}}</h2>
  <h2>{
  {firstName}} {
  {lastName}}</h2>

  <h2>{
  {getFullName()}}</h2>

  <h2>{
  {fullName}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      firstName: 'Lebron',
      lastName: 'James'
    },
    // computed: 计算属性()
    computed: {
      fullName: function () {
        return this.firstName + ' ' + this.lastName
      }
    },
    methods: {
      getFullName() {
        return this.firstName + ' ' + this.lastName
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

2. 02-计算属性的复杂操作.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02-计算属性的复杂操作</title>
</head>
<body>

<div id="app">
  <h2>总价格: {
  {totalPrice}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      books: [
        {id: 110, name: 'Unix编程艺术', price: 119},
        {id: 111, name: '代码大全', price: 105},
        {id: 112, name: '深入理解计算机原理', price: 98},
        {id: 113, name: '现代操作系统', price: 87},
      ]
    },
    computed: {
      totalPrice: function () {
        let result = 0
        for (let i=0; i < this.books.length; i++) {
          result += this.books[i].price
        }
        return result

        // for (let i in this.books) {
        //   this.books[i]
        // }
        //
        // for (let book of this.books) {
        //
        // }
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

3. 03-计算属性的setter和getter.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03-计算属性的setter和getter</title>
</head>
<body>

<div id="app">
  <h2>{
  {fullName}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      firstName: 'Kobe',
      lastName: 'Bryant'
    },
    computed: {
      /*
      * 这是计算属性的 简写方式
      * */
      // fullName: function () {
      //   return this.firstName + ' ' + this.lastName
      // }

      /*
      * 这是计算属性的原始写法
      * */
      // name: 'coderwhy'
      // 计算属性一般是没有set方法, 只读属性.
      fullName: {
        set: function(newValue) {
          // console.log('-----', newValue);
          const names = newValue.split(' ');
          this.firstName = names[0];
          this.lastName = names[1];
        },
        get: function () {
          return this.firstName + ' ' + this.lastName
        }
      },

      // fullName: function () {
      //   return this.firstName + ' ' + this.lastName
      // }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

4. 04-计算属性和methods的对比.html

  1. methods 会执行 4 次
  2. computed 会执行 1 次, 其效率会高于 methods
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>04-计算属性和methods的对比</title>
</head>
<body>

<div id="app">
  <h1>1.直接拼接: 语法过于繁琐</h1>
  <h5>{
  {firstName}} {
  {lastName}}</h5>

  <h1>2.通过定义 methods</h1>
  <h5>{
  {getFullName()}}</h5>
  <h5>{
  {getFullName()}}</h5>
  <h5>{
  {getFullName()}}</h5>
  <h5>{
  {getFullName()}}</h5>

  <h1>3.通过 computed</h1>
  <h5>{
  {fullName}}</h5>
  <h5>{
  {fullName}}</h5>
  <h5>{
  {fullName}}</h5>
  <h5>{
  {fullName}}</h5>

  <!--
    methods 会执行 4 次
    computed 会执行 1 次, 其效率会高于 methods

  -->
</div>

<script src="../../lib/vue.js"></script>
<script>

  const app = new Vue({
    el: '#app',
    data: {
      firstName: 'Kobe',
      lastName: 'Bryant'
    },
    methods: {
      getFullName: function () {
        console.log('getFullName');
        return this.firstName + ' ' + this.lastName
      }
    },
    computed: {
      fullName: function () {
        console.log('fullName');
        return this.firstName + ' ' + this.lastName
      }
    }
  })

</script>

</body>
</html>

在这里插入图片描述

相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
28天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
28天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
28天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)
|
28天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
29 1
vue学习第九章(v-model)
|
28天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
39 1
vue学习第十章(组件开发)