vue2.0-基础

VUE2.0

什么是 vue

  1. 构建用户界面
    • 用 vue 往 html 页面中填充数据,非常的方便
  2. 框架
    • 框架是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能!
    • 要学习 vue,就是在学习 vue 框架中规定的用法!
    • vue 的指令、组件(是对 UI 结构的复用)、路由、Vuex、vue 组件库
    • 只有把上面罗列的内容掌握以后,才有开发 vue 项目的能力!

vue 的两个特性

  1. 数据驱动视图:

    • 数据的变化会驱动视图自动更新
    • 好处:程序员只管把数据维护好,那么页面结构会被 vue 自动渲染出来!

  2. 双向数据绑定:

    在网页中,form 表单负责采集数据,Ajax 负责提交数据

    • js 数据的变化,会被自动渲染到页面上
    • 页面上表单采集的数据发生变化的时候,会被 vue 自动获取到,并更新到 js 数据中

注意:数据驱动视图和双向数据绑定的底层原理是 MVVM(Mode 数据源、View 视图、ViewModel 就是 vue 的实例,MVVM的核心)

基本使用

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<body>
<!-- 希望 Vue 能够控制下面的这个 div,帮我们在把数据填充到 div 内部 -->
<div id="app">{{ username }}</div>

<!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
<script src="./lib/vue-2.6.12.js"></script>
<!-- 2. 创建 Vue 的实例对象 -->
<script>
// 创建 Vue 的实例对象
const vm = new Vue({
// el 属性是固定的写法,表示当前 vm 实例要控制页面上的哪个区域,接收的值是一个选择器
el: '#app',
// data 对象就是要渲染到页面上的数据
data: {
username: 'zhangsan'
}
})
</script>
</body>

vue 指令

1. 内容渲染指令

  1. v-text 指令的缺点:会覆盖元素内部原有的内容!
  2. {{ }} 插值表达式:在实际开发中用的最多,只是内容的占位符,不会覆盖原有的内容!
  3. v-html 指令的作用:可以把带有标签的字符串,渲染成真正的 HTML 内容!

2. 属性绑定指令

注意:插值表达式只能用在元素的内容节点中,不能用在元素的属性节点中!

  • 在 vue 中,可以使用 v-bind: 指令,为元素的属性动态绑定值;

  • 变化是单向的

  • 简写是英文的 :

  • 在使用 v-bind 属性绑定期间,如果绑定内容需要进行动态拼接,则字符串的外面应该包裹单引号,例如:

    1
    <div :title="'box' + index">这是一个 div</div>

3. 事件绑定

  1. v-on: 简写是 @

  2. 语法格式为:

    接受方法名或对某个方法的调用

    1
    2
    3
    4
    5
    6
    7
    8
    <button @click="add"></button>

    methods: {
    add() {
    // 如果在方法中要修改 data 中的数据,可以通过 this 访问到
    this.count += 1
    }
    }
  3. $event 的应用场景:如果默认的事件对象 e 被覆盖了,则可以手动传递一个 $event。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <button @click="add(3, $event)"></button>

    methods: {
    add(n, e) {
    // 如果在方法中要修改 data 中的数据,可以通过 this 访问到
    this.count += 1
    }
    }
    //如果不传参,默认会传递一个事件对象e
    //如果传参了,事件对象会被覆盖掉
  4. 事件修饰符:

    • .prevent

      1
      2
      3
      <a @click.prevent="xxx">链接</a>

      既为a绑定点击事件也阻止默认行为
    • .stop

      1
      2
      3
      <button @click.stop="xxx">按钮</button>

      //阻止冒泡

    5.按键修饰符:

1
2
3
4
5
<div id="app">
<input type="text" @keyup.esc="clearInput" @keyup.enter="commitAjax">
</div>

按下esc,做出响应,按下enter,做出响应

4. v-model 指令

v-bind是单向的绑定,v-model是双向的绑定

  1. input 输入框
    • type=”radio”
    • type=”checkbox”
    • type=”xxxx”
  2. textarea
  3. select
  • 文本类型的 <input><textarea> 元素会绑定 value property 并侦听 input 事件;
  • <input type="checkbox"><input type="radio"> 会绑定 checked property 并侦听 change 事件;
  • <select> 会绑定 value property 并侦听 change 事件。

修饰符

  • 如果你想让用户输入自动转换为数字,你可以在 v-model 后添加 .number 修饰符来管理输入:
  • 如果你想要默认自动去除用户输入内容中两端的空格,你可以在 v-model 后添加 .trim 修饰符:
  • 默认情况下,v-model 会在每次 input 事件后更新数据 (IME 拼字阶段的状态例外)。你可以添加 lazy 修饰符来改为在每次 change 事件后更新数据:

5. 条件渲染指令

  1. v-show 的原理是:动态为元素添加或移除 display: none 样式,来实现元素的显示和隐藏
    • 如果要频繁的切换元素的显示状态,用 v-show 性能会更好
  2. v-if 的原理是:每次动态创建或移除元素,实现元素的显示和隐藏
    • 如果刚进入页面的时候,某些元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时 v-if 性能更好

在实际开发中,绝大多数情况,不用考虑性能问题,直接使用 v-if 就好了!!!

v-if 指令在使用的时候,有两种方式:

  1. 直接给定一个布尔值 true 或 false

    1
    <p v-if="true">被 v-if 控制的元素</p>
  2. 给 v-if 提供一个判断条件,根据判断的结果是 true 或 false,来控制元素的显示和隐藏

    1
    <p v-if="type === 'A'">良好</p>

6. 列表渲染

v-for

我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法,其中 items 是源数据的数组,而 item 是迭代项的别名

1
2
3
4
5
data() {
return {
items: [{ message: 'Foo' }, { message: 'Bar' }]
}
}
1
2
3
<li v-for="item in items">
{{ item.message }}
</li>

为了给 Vue 一个提示,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你需要为每个元素对应的块提供一个唯一的 key attribute(index不是唯一的):

1
2
3
<div v-for="item in items" :key="item.id">
<!-- 内容 -->
</div>

key 绑定的值期望是一个基础类型的值,例如字符串或 number 类型。不要用对象作为 v-for 的 key

过滤器

过滤器(Filters)是 vue 为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方:插值表达式
和 v-bind 属性绑定。(vue3没有)
过滤器应该被添加在 JavaScript 表达式的尾部,由“管道符”进行调用,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<body>
<div id="app">
<p>message 的值是:{{ message | capi }}</p>
</div>

<script src="./lib/vue-2.6.12.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
message: 'hello vue.js'
},
// 过滤器函数,必须被定义到 filters 节点之下
// 过滤器本质上是函数
filters: {
// 注意:过滤器函数形参中的 val,永远都是“管道符”前面的那个值
capi(val) {
// 字符串有 charAt 方法,这个方法接收索引值,表示从字符串中把索引对应的字符,获取出来
// val.charAt(0)
const first = val.charAt(0).toUpperCase()
// 字符串的 slice 方法,可以截取字符串,从指定索引往后截取
const other = val.slice(1)
// 强调:过滤器中,一定要有一个返回值
return first + other
}
}
})
</script>
</body>

在 filters 节点下定义的过滤器,称为“私有过滤器”,因为它只能在当前 vm 实例所控制的 el 区域内使用。
如果希望在多个 vue 实例之间共享过滤器,则可以按照如下的格式定义全局过滤器:

1
2
3
4
5
Vue.filter('capi', function (str) {
const first = str.charAt(0).toUpperCase()
const other = str.slice(1)
return first + other + '~~~'
})

侦听器

watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。

侦听器的格式

  1. 方法格式的侦听器
    • 缺点1:无法在刚进入页面的时候,自动触发!!!
    • 缺点2:如果侦听的是一个对象,如果对象中的属性发生了变化,不会触发侦听器!!!
1
2
3
4
5
6
7
8
9
10
11
watch: {
// 侦听器本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法名即可
// 新值在前,旧值在后
username(newVal) {
if (newVal === '') return
// 1. 调用 jQuery 中的 Ajax 发起请求,判断 newVal 是否被占用!!!
$.get('https://www.escook.cn/api/finduser/' + newVal, function (result) {
console.log(result)
})
}
}
  1. 对象格式的侦听器
  • 好处1:可以通过 immediate 选项,让侦听器自动触发!!!
  • 好处2:可以通过 deep 选项,让侦听器深度监听对象中每个属性的变化!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
watch: {
// 定义对象格式的侦听器
info: {
// 侦听器的处理函数
handler(newVal, oldVal) {
console.log(newVal, oldVal)
},
// immediate 选项的默认值是 false
// immediate 的作用是:控制侦听器是否自动触发一次!
immediate: true,
deep: true
}
}

计算属性

计算属性指的是通过一系列运算之后,最终得到一个属性值。
这个动态计算出来的属性值可以被模板结构methods 方法使用。示例代码如下

① 虽然计算属性在声明的时候被定义为方法,但是计算属性的本质是一个属性
② 计算属性会缓存计算的结果,只有计算属性依赖的数据变化时,才会重新进行运算

axios

专注于网络请求的库

axios 的基本使用

调用 axios 方法得到的返回值是 Promise 对象(所以可以有then方法)

  1. 发起 GET 请求:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    axios({
    // 请求方式
    method: 'GET',
    // 请求的地址
    url: 'http://www.liulongbin.top:3006/api/getbooks',
    // URL 中的查询参数
    params: {
    id: 1
    }
    }).then(function (result) {
    console.log(result)
    })
  2. 发起 POST 请求:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    document.querySelector('#btnPost').addEventListener('click', async function () {
    // 如果调用某个方法的返回值是 Promise 实例,则前面可以添加 await!可以拿到返回的对象
    // await 只能用在被 async “修饰”的方法中,利用解构赋值解构出data
    const { data: res } = await axios({
    method: 'POST',
    url: 'http://www.liulongbin.top:3006/api/post',
    header: {},
    data: {
    name: 'zs',
    age: 20
    } //传json给datafu直接赋值一个js对象就行,axios内部会处理
    })

    console.log(res)
    })

(返回的数据对象中的data才是真实的数据)

1
2
3
4
5
6
7
8
9
10
11
12
document.querySelector('#btnGet').addEventListener('click', async function () {
// 解构赋值的时候,使用 : 进行重命名
// 1. 调用 axios 之后,使用 async/await 进行简化
// 2. 使用解构赋值,从 axios 封装的大对象中,把 data 属性解构出来
// 3. 把解构出来的 data 属性,使用 冒号 进行重命名,一般都重命名为 { data: res }
const { data: res } = await axios({
method: 'GET',
url: 'http://www.liulongbin.top:3006/api/getbooks'
})

console.log(res.data)
})

await接收了axios返回的promise对象的终值

直接使用axios.get()和axios.post() (还有axios.put(),axios.delete())

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
document.querySelector('#btnGET').addEventListener('click', async function () {
/* axios.get('url地址', {
// GET 参数
params: {}
}) */

const { data: res } = await axios.get('http://www.liulongbin.top:3006/api/getbooks', {
params: { id: 1 }
})
console.log(res)
})

document.querySelector('#btnPOST').addEventListener('click', async function () {
// axios.post('url', { /* POST 请求体数据 */ })
const { data: res } = await axios.post('http://www.liulongbin.top:3006/api/post', { name: 'zs', gender: '女' })
console.log(res)
})
</script>

vue-cli 的使用

单页面应用程序(英文名:Single Page Application)简称 SPA,顾名思义,指的是一个 Web 网站中只有唯一的一个 HTML 页面,所有的功能与交互都在这唯一的一个页面内完成

  1. 安装完vue-cli后在终端下运行如下的命令,创建指定名称的项目:

    1
    2
    3
    4
    5
    6
    vue create 项目的名称
    执行create后,继续在终端中选择预设
    一般选择manually select features

    babel 解决js兼容性
    eslint 规定代码风格
  2. vue项目根目录构成

    1
    2
    3
    4
    public
    src
    babel //预设时设定babel的配置文件不放到package中
    package

  3. vue 项目中 src 目录的构成:

    1
    2
    3
    4
    assets 文件夹:存放项目中用到的静态资源文件,例如:css 样式表、图片资源
    components 文件夹:程序员封装的、可复用的组件,都要放到 components 目录下
    main.js 是项目的入口文件。整个项目的运行,要先执行 main.js
    App.vue 是项目的根组件。

在工程化的项目中,vue 要做的事情很单纯:通过 main.js 把 App.vue 渲染到 index.html 的指定区域中。

① App.vue 用来编写待渲染的模板结构

② index.html 中需要预留一个 el 区域

③ main.js 把 App.vue 渲染到了 index.html 所预留的区域中


vue2.0-基础
https://wjcbolg.cn/2023/06/19/VUE2.0-1/
作者
JasonWang
发布于
2023年6月19日
许可协议
BY-JW