Vue2.5零基础开发实战(02)-极速入门

简介: Vue2.5零基础开发实战(02)-极速入门

讲解部分 Vue 基础语法,通过 TodoList 功能编写,在熟悉基础语法的基础上,扩展解析 MVVM 模式及前端组件化的概念及优势。

1  案例

1.1 下载安装

https://v2.cn.vuejs.org/v2/guide/installation.html

1.2 原生实现打印

<!DOCTYPE html>

<htmllang="en">

 <head>

   <metacharset="UTF-8">

   <title>JavaEdge</title>

 </head>

 <body>

 <divid="app">

   <script>

     vardom=document.getElementById('app')

     dom.innerHTML='JavaEdge'

   </script>

 </div>

 </body>

</html>

1.3 创建一个 Vue 实例

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例 开始:

varapp=newVue({

 // 选项

})

创建一个 Vue 实例时,可传入一个选项对象。本文教你如何使用这些选项创建你想要的行为。

1.4 一个 Vue 应用的组成

  • 一个通过 new Vue 创建的根 Vue 实例
  • 可选的嵌套的、可复用的组件树

所有 Vue 组件都是 Vue 实例,并接受相同的选项对象(除了根实例特有选项)。

若使用Vue.js如何实现打印?

<!--Vue.js实现打印-->

<!DOCTYPE html>

<htmllang="en"xmlns:v-on="http://www.w3.org/1999/xhtml">

<head>

   <metacharset="UTF-8">

   <title>JavaEdge</title>

   <scriptsrc="./vue.js"></script>

</head>

<body>

<divid="app1">

   {{content}}

</div>

 

<script>

   // 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例 开始

   varapp1=newVue({

       el: "#app1",

       data: {

           content: 'JavaEdge',

       }

   })

</script>

</body>

</html>

没问题,正常打印:

2 数据与方法

当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,视图将“响应”,即匹配更新为新的值。

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>JavaEdge</title>

   <scriptsrc="./vue.js"></script>

</head>

<body>

<divid="app2">

</div>

 

<script>

   // 我们的数据对象

   vardata= { a: 1 }

 

   // 该对象被加入到一个 Vue 实例中

   varapp2=newVue({

       data: data

   })

 

   // 获得这个实例上的属性

   // 返回源数据中对应的字段

   app2.a==data.a// => true

 

   // 设置属性也会影响到原始数据

   app2.a=2

   data.a// => 2

 

   // ……反之亦然

   data.a=3

   app2.a// => 3

</script>

</body>

</html>

当这些数据改变时,视图会重新渲染。

只有当实例被创建时,data 中存在的属性才是响应式的。也就是说若你添加一个新属性,如:

app2.b='hi'

对 b 的改动将不会触发任何视图的更新。

若你知道会在晚些时候需要一个属性,但一开始它为空或不存在,你仅需要设置一些初始值。如:

data: {

 newTodoText: '',

 visitCount: 0,

 hideCompletedTodos: false,

 todos: [],

 error: null

}

唯一例外是使用 Object.freeze(),这会阻止修改现有的属性,即响应系统无法再追踪变化。

varobj= {

 foo: 'bar'

}

 

Object.freeze(obj)

 

newVue({

 el: '#app',

 data: obj

})

<divid="app">

 <p>{{ foo }}</p>

 <!-- 这里的 `foo` 不会更新! -->

 <buttonv-on:click="foo = 'baz'">Change it</button>

</div>

2.1 接管区域

非接管区域的内容,不care它:

<!--Vue.js实现打印-->

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>JavaEdge</title>

   <scriptsrc="../vue.js"></script>

</head>

<body>

<divid="app1">

   {{content}}

</div>

<div>

   {{content}}

</div>

 

<script>

   // 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例 开始

   varapp1=newVue({

       // 接管数据的区域范围

       el: "#app1",

       // 数据内容

       data: {

           content: 'JavaEdge',

       }

   })

</script>

</body>

</html>

会原封不动输出:

2.2 定时操作

最古老的操作DOM

vardom=document.getElementById('root')

dom.innerHTML='JavaEdge'

 

setTimeout(function () {

   dom.innerHTML='bye JavaEdge'

}, 2000);

Vue.js

无需再管 dom 操作,而是将注意力都放在对数据的管理。数据是啥,页面就展示啥。

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>hello world</title>

   <scriptsrc="vue.js"></script>

</head>

<body>

<divid="root">

   {{title}}

</div>

 

<script>

   varapp=newVue({

       el: "#root",

       data: {

           title: "hello world"

       }

   })

 

   setTimeout(function () {

       app.$data.title="bye world"

   }, 2000)

</script>

</body>

</html>

暴露实例属性与方法

除了数据属性,Vue 实例还暴露一些有用的实例属性与方法。它们都有前缀 $,以与用户定义的属性区分。如:

<!DOCTYPEhtml>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>helloworld</title>

   <scriptsrc="vue.js"></script>

</head>

<body>

<divid="example">

   {{title}}

</div>

 

<script>

   vardata= {a: 1}

   varvm=newVue({

       el: '#example',

       data: data

   })

 

   // => true

   vm.$data===data

   // => true

   vm.$el===document.getElementById('example')

 

   // $watch 是一个实例方法

   vm.$watch('a', function (newValue, oldValue) {

       // 这个回调将在 `vm.a` 改变后调用

   })

</script>

</body>

</html>

3 列表渲染

3.1  v-for

把一个数组对应为一组元素。

v-for 根据一组数组的选项列表进行渲染,需使用 item in items 语法:

  • items 是源数据数组
  • item 是数组元素迭代的别名

<!DOCTYPEhtml>

<htmllang="en">

<head>

   <scriptsrc='vue.js'></script>

</head>

<body>

<divid="app">

   <ulid="example-1">

       <liv-for="item in items">

           {{ item.message }}

       </li>

   </ul>

</div>

 

<script>

   varexample1=newVue({

       el: '#example-1',

       data: {

           items: [

               { message: 'Foo' },

               { message: 'Bar' }

           ]

       }

   })

</script>

</body>

</html>

结果:

Foo

Bar

v-for 块中,我们拥有对父作用域属性的完全访问权限。

v-for 支持可选的第二个参数为当前项的索引:

<!DOCTYPEhtml>

<htmllang="en">

<head>

   <scriptsrc='vue.js'></script>

</head>

<body>

<divid="app">

   <ulid="example-2">

       <liv-for="(item, index) in items">

           {{ parentMessage }} - {{ index }} - {{ item.message }}

       </li>

   </ul>

</div>

 

<script>

   varexample2=newVue({

       el: '#example-2',

       data: {

           parentMessage: 'Parent',

           items: [

               {message: 'Foo'},

               {message: 'Bar'}

           ]

       }

   })

</script>

</body>

</html>

结果:

Parent - 0 - Foo

Parent - 1 - Bar

也可用 of 替代 in 作为分隔符,因为它最接近 JS 迭代器的语法:

<divv-for="item of items"></div>

3.2  一个对象的 v-for

也可用 v-for 通过一个对象的属性来迭代。

遍历对象时,是按 Object.keys() 的结果遍历,但不保证它的结果在不同的 JavaScript 引擎下是一致的。

<ulid="v-for-object"class="demo">

 <liv-for="value in object">

   {{ value }}

 </li>

</ul>

也可提供第二个的参数为键名:

<divv-for="(value, key) in object">

 {{ key }}: {{ value }}

</div>

第三个参数为索引:

<divv-for="(value, key, index) in object">

 {{ index }}. {{ key }}: {{ value }}

</div>

遍历对象时,是按 Object.keys() 的结果遍历,但不保证它的结果在不同 JavaScript 引擎下一致。

3.3  key

当 Vue 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。若数据项顺序被改变,Vue 不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并确保它在特定索引下显示已被渲染过的每个元素。类似 Vue 1.x 的 track-by="$index"

这默认模式是高效的,但只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的唯一 id。这特殊属性相当于 Vue 1.x 的 track-by ,但其工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值 (在这里使用简写):

<divv-for="item in items" :key="item.id">

 <!-- 内容 -->

</div>

建议尽可能使用 v-for 时提供 key,除非:

  • 遍历输出的 DOM 内容简单
  • 或刻意依赖默认行为,以获取性能提升

因为它是 Vue 识别节点的一个通用机制,key 并不与 v-for 特别关联。不要使用对象或数组之类的非原始类型值作为 v-forkey。用字符串或数类型的值取而代之。

① 最初文件

<!DOCTYPEhtml>

<htmllang="en">

<head>

   <metacharset="UTF-8">

</head>

<body>

<divid="app">

   <inputtype="text"/>

   <button>提交</button>

   <ul>

       <li>first</li>

       <li>second</li>

   </ul>

</div>

</body>

</html>

效果:

② Vue版

<!DOCTYPEhtml>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <scriptsrc='vue.js'></script>

</head>

<body>

<divid="app">

   <inputtype="text"/>

   <button>提交</button>

   <ul>

       <liv-for="item in list">{{item}}</li>

   </ul>

</div>

 

<script>

   varapp=newVue({

       el: '#app',

       data: {

           list: ['first', 'second'],

       }

   })

</script>

</body>

</html>

4 事件处理

4.1  监听事件

v-on 指令监听 DOM 事件,并在触发时运行一些 JS 代码。

<!DOCTYPEhtml>

<htmllang="en"xmlns:v-on="http://www.w3.org/1999/xhtml">

<head>

   <metacharset="UTF-8">

   <scriptsrc='vue.js'></script>

</head>

<body>

<divid="example-1">

   <buttonv-on:click="counter += 1">Add1</button>

   <p>button被点击了{{ counter }}</p>

</div>

 

<script>

   varexample1=newVue({

       el: '#example-1',

       data: {

           counter: 0

       }

   })

</script>

</body>

</html>

4.2 事件处理方法(绑定点击事件)

但许多事件处理逻辑复杂,所以直接把 JS 代码写在 v-on 指令中不行, v-on 还可接收一个需要调用的方法名称:

<!DOCTYPEhtml>

<htmllang="en"xmlns:v-on="http://www.w3.org/1999/xhtml">

<head>

   <metacharset="UTF-8">

   <scriptsrc='vue%205/vue.js'></script>

</head>

<body>

<divid="example-2">

   <!-- `greet` 是在下面定义的方法名 -->

   <buttonv-on:click="greet">Greet</button>

</div>

 

<script>

   varexample2=newVue({

       el: '#example-2',

       data: {

           name: 'Vue.js'

       },

       // 在 `methods` 对象中定义方法

       methods: {

           greet: function (event) {

               // `this` 在方法里指向当前 Vue 实例

               alert('Hello '+this.name+'!')

               // `event` 是原生 DOM 事件

               if (event) {

                   alert(event.target.tagName)

               }

           }

       }

   })

 

   // 也可以用 JavaScript 直接调用方法

   example2.greet() // => 'Hello Vue.js!'

</script>

</body>

</html>

点击 Greet 按钮后弹窗:

5  表单输入绑定

5.1  基础用法

v-model 指令在表单:

  • <input>
  • <textarea>
  • <select>

元素上创建双向数据绑定。它会根据控件类型,自动选取正确方法来更新元素。有点神奇,但本质不过是个语法糖。

它负责监听用户的输入事件以更新数据,并对一些极端场景特殊处理。

v-model 会忽略所有表单元素的 valuecheckedselected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JS 在组件的 data 选项中声明初始值。

对于需要使用输入法(如中文、日文、韩文等)的语言, v-model 不会在输入法组合文字过程中得到更新。若想处理这个过程,用 input 事件。

<script>

   newVue({

       el: '#app',

       data: {

           message: '',

           checked: false

       }

   })

 

</script>

  • [文本]

<inputv-model="message"placeholder="edit me">

<p>Message is: {{ message }}</p>

  • [多行文本]

<pstyle="white-space: pre-line;">{{ message }}</p>

<br>

<textareav-model="message"placeholder="add multiple lines"></textarea>

Multiline message is:

<textareaplaceholder="add multiple lines"></textarea>

在文本区域插值 (<textarea></textarea>) 并不会生效,应用 v-model 来代替。

5.2 复选框

单个复选框

绑定到布尔值:

<inputtype="checkbox"id="checkbox"v-model="checked">

<labelfor="checkbox">{{ checked }}</label>

多个复选框

绑定到同一个数组:

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>TodoList</title>

   <scriptsrc='vue.js'></script>

</head>

<body>

 

<divid='example-3'>

   <inputtype="checkbox"id="jack"value="Jack"v-model="checkedNames">

   <labelfor="jack">Jack</label>

   <inputtype="checkbox"id="john"value="John"v-model="checkedNames">

   <labelfor="john">John</label>

   <inputtype="checkbox"id="mike"value="Mike"v-model="checkedNames">

   <labelfor="mike">Mike</label>

   <br>

   <span>Checked names: {{ checkedNames }}</span>

</div>

 

<script>

   newVue({

       el: '#example-3',

       data: {

           checkedNames: []

       }

   })

</script>

</body>

</html>

5.3 单选按钮

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>TodoList</title>

   <scriptsrc='vue.js'></script>

</head>

<body>

 

<divid="example-4">

   <inputtype="radio"id="one"value="One"v-model="picked">

   <labelfor="one">One</label>

   <br>

   <inputtype="radio"id="two"value="Two"v-model="picked">

   <labelfor="two">Two</label>

   <br>

   <span>Picked: {{ picked }}</span>

</div>

 

<script>

   newVue({

       el: '#example-4',

       data: {

           picked: ''

       }

   })

</script>

</body>

</html>

5.4 选择框

单选时:

<!DOCTYPE html>

<htmllang="en">

<head>

   <metacharset="UTF-8">

   <title>TodoList</title>

   <scriptsrc='vue.js'></script>

</head>

<body>

 

<divid="example-5">

   <selectv-model="selected">

       <optiondisabledvalue="">请选择</option>

       <option>A</option>

       <option>B</option>

       <option>C</option>

   </select>

   <span>Selected: {{ selected }}</span>

</div>

 

<script>

   newVue({

       el: '#example-5',

       data: {

           selected: ''

       }

   })

</script>

</body>

</html>

若 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,推荐像该案例这样,提供一个值为空的禁用选项。

5.5 实现表单数据绑定

初始时值为空串:

产生输入后,值发生变化:

在控制台改变值后,页面值随之改变:

如何使得点击事件可以发现输入框的值呢?

让我们快速进入下一个任务,要实现输入内容提交后打印,何解?

<!DOCTYPE html>

<htmllang="en"xmlns:v-on="http://www.w3.org/1999/xhtml">

<head>

   <metacharset="UTF-8">

   <title>TodoList</title>

   <scriptsrc='vue.js'></script>

</head>

<body>

<divid="app">

   <inputtype="text"v-model="inputValue"/>

   <buttonv-on:click="handleBtnClick">提交</button>

   <ul>

       <liv-for="item in list">{{item}}</li>

   </ul>

</div>

 

<script>

   varapp=newVue({

       el: '#app',

       data: {

           list: [],

           inputValue: ''

       },

       methods: {

           handleBtnClick: function () {

               this.list.push(this.inputValue)

           }

       }

   })

</script>

</body>

</html>

即可实现,是不是很简单呢~

可是发现好麻烦呀,每次提交,都需要手动清除前一次输入的内容,何解?

handleBtnClick: function () {

   this.list.push(this.inputValue)

   this.inputValue=''

}

6 总结

是不是很简单~

至此,待办任务功能实现完毕,无任何DOM操作,全程只操作数据!Vue完美!此即为MVVM模式,下回分解MVVM,不见不散!

目录
相关文章
|
11月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
528 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
680 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
11月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1069 17
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
1067 1
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
196 1
|
JavaScript 前端开发
vue全局公共组件自动引入并注册,开发效率直接起飞!
【10月更文挑战第14天】vue全局公共组件自动引入并注册,开发效率直接起飞!
569 1
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
2711 0
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
JavaScript 前端开发
Vue开发必备:$nextTick方法的理解与实战场景
Vue开发必备:$nextTick方法的理解与实战场景
1176 1