2023年8月3日14:56:49
概念:Vue是一个用于 构建用户界面 的 渐进式 框架
标签引入。 创建Vue实例,初始化渲染
1.准备容器(就是Vue所管理的范围)
2.引包(开发版本包 / 生产版本包)
3.创建实例
4.添加配置项 => 完成渲染
<div id="app"> {{ msg }} <a href="#"> {{ count }}a> div> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script> <script> // 一旦引入 VueJs核心包,在全局环境,就有了 Vue 构造函数 // 第三、创建一个 Vue 实例 const app = new Vue ({ // 第四、通过 el 配置一个选择器,指定 Vue 管理的是哪个盒子 el: '#app', // 通过 data 提供数据 data: { msg: 'hello Vue', count: 666 } }) script>
- el :指定挂载点,选择器指定控制的是哪个盒子
- data : 提供数据
Vue实例 :app 管控的范围 仅限于在挂载点指定的那个容器盒子。
差值表达式:是一种Vue的模板语法
作用:利用表达式进行插值,渲染到页面中
什么是表达式呢? 是可以被求值的代码,JS引擎会将其计算出一个结果
(1) 使用的数据必须存在(data)
(2) 支持的是表达式、而非语句,例如:if for…
(3) 不能在标签属性中使用{{}} 差值表达式
<div id="app"> <span>{{ username }}span><br> <span>{{ username.toUpperCase() }}span><br> <span>{{ username + '加油'}}span><br> <span>{{ age >= 18 ? '成年' : '未成年'}}span><br> <span>{{ friend.name }}span> <span>{{ friend.desc }}span> div> <script> // 这是一个 Vue 实例 const app = new Vue ({ el: '#app', data: { username: 'liubuzhu', age: 18, friend: { name: 'Mrliu', desc: '热爱学习 Vue' } } }) script>
响应式: 数据发生变化,视图自动更新。
data中的数据,是会被添加到实例上, 也就是实例对象 app
1.访问数据 :实例.属性名
2.修改数据 :实例.属性名 = 新的值
原理:数据变化了 -> Vue监听到数据修改 —> 自动更新视图(DOM操作)
Vue 中的指令:特征是 v- 开头 ,注意:他是特殊的 属性 ,和普通的属性不同。
语法:v-指令 === 表达式
<div id="app"> <div v-html="msg"> div> <a href="">a> div> <script> const app = new Vue({ el: '#app', data: { msg: ` 黑马程序员 ` } }) script>
- 不同的指令——> 解决不同的需求(功能不同)
<div id="app"> <div v-show="flag" class="box">我是v-show控制的盒子div> <div v-if="flag" class="box">我是v-if控制的盒子div> div> <script> // 创建Vue实例 const app = new Vue({ el: '#app', data: { flag: true } }) script>
注意:v-else需要紧挨着 v-if 一起使用,不能单独使用。
<div id="app"> <p v-if="gender === 1">性别: 男p> <p v-else>性别: 女p> <hr> <p v-if="score >= 90">成绩评定A: 奖励一台电脑p> <p v-else-if="score >= 70">成绩评定B: 奖励周末郊游p> <p v-else-if="score >= 60">成绩评定C: 奖励零食礼包p> <p v-else>成绩评定D; 惩罚一周不能玩手机p> div> <script> const app = new Vue({ el: '#app', data: { gender: 1, score: 10 } }) script>
- v-on:事件名=“内联语句”
- 简写方式:v-on: === @ ==>
@click="处理逻辑"
什么是内联语句呢?
v-on:事件名字是可以自己决定的,不单单一个。
<div id="app"> <button v-on:click="count--">-button> <span> {{ count }}span> <button v-on:mouseenter="count++">+button> div> <script> // 创建一个 Vue 实例 app const app = new Vue({ el: '#app', data: { count: 100 } }) script>
在 Vue 实例对象中 :data 提供数据 那么methods 给我们提供方法
在methods中的所有函数,this指向的都是当前 Vue 的实例对象。
代码示例
<div id="app"> <button @click="fn">点击切换显示隐藏button> <h1 v-show="isShow"> Vue.Jsh1> div> <script> const app = new Vue({ el: '#app', data: { isShow: true }, methods: { fn () { // methods里面的所有函数this指向的都是Vue实例 this.isShow = !this.isShow } } })
- 切记: methods里面的所有函数this指向的都是Vue实
<div id="app"> <h3>小黑自动售货机h3> <button @click="buy(5)" class="btn1">可乐5元button> <button @click="buy(10)" class="btn2">咖啡10元button> <span>银行卡余额为: {{ money }}元span> div> <script> // 创建Vue实例 const app = new Vue({ el: '#app', data: { money: 100 }, methods: { buy (price) { this.money = this.money - price } } }) script>
- 切记methods里面的this指向实例对象
:src
省略了v-bind<div id="app"> <img :src="imgUrl":title="msg" alt=""> div> <script> // 创建一个 Vue 实例对象 const app = new Vue({ el: '#app', data: { imgUrl: './imgs/10-01.png', msg: 'hello 波仔' } }) script>
需求:点击上一张或下一张进行图片的更换
<div id="app"> <button v-show="count > 0" @click="count--">上一页button><br> <img :src="arrUrl[count]" alt=""><br> <button v-show="count < arrUrl.length - 1" @click="count++">下一页button> div> <script> const app = new Vue({ el: '#app', data: { // 2、准备数组下标 count: 0, // 1、将图片存于数组中 arrUrl: [ './imgs/11-00.gif', './imgs/11-01.gif', './imgs/11-02.gif', './imgs/11-03.gif', './imgs/11-04.png', './imgs/11-05.png', ] } }) script>
语法: v-for=“(item,index) in 数组”
- item : 每一项 (当只有一个参数的时候,可以省略小括号)
- index 下标 (不需要下标的时候可以省略)
高阶语法都有个特性:就是会根据数据来操作的,例如数据元素有几个我就遍历几次。
<div id="app"> <h3>小黑水果店h3> <ul> <li v-for="(item,index) in list"> {{ item }} - {{ index }} li> ul> div> <script> const app = new Vue({ el: '#app', data: { list: ['西瓜','苹果','鸭梨','榴莲'] } }) script>
- 里面可以通过插值表达式来跟新内容哦
需求:通过 v-for指令 遍历数组中的数据到书架中,然后动态的进行渲染,并且能够实现删除功能(注意 Vue 是数据驱动,数据变化,视图自动更新)。
<div id="app"> <h3>小黑的书架h3> <ul> <li v-for="(item,index) in booksList" :key="item.id"> <span>{{ item.name }}span> <span> {{ item.author }} span> <button @click="del(item.id)">删除button> li> ul> div> <script> const app = new Vue({ el: '#app', data: { booksList: [ {id: 1, name: '《红楼梦》', author: '曹雪芹'}, {id: 2, name: '《西游记》', author: '吴承恩'}, {id: 3, name: '《水浒传》', author: '施耐庵'}, {id: 4, name: '《三国演义》', author: '罗贯中'}, ] }, methods: { del(id) { // console.log('删除',id) // 使用filter过滤器过滤符合条件的,并返回新数组。 this.booksList = this.booksList.filter(item => item.id !== id) } } }) script>
<div id="app"> 账户:<input type="text" v-model="username"><br> 密码:<input type="password" v-model="password"><br> <button @click="login">登录button> <button @click="reset">重置button> div> <script> const app = new Vue({ el: '#app', data: { username: '', password: '' }, methods: { login () { console.log(this.username,this.password) }, reset () { this.username = '' this.password = '' } } }) script>
- 数据变化,视图自动更新
- 视图变化,数据自动更新
需求:对记事本的增删进行操作、实现统计、和重置(要求使用Vue指令实现)
列表渲染:
删除功能:
添加功能 :
底部统计 和 清空重置:
<link rel="stylesheet" href="./css/notepad.css" /> <title>记事本title> head> <body> <section id="app"> <header class="header"> <h1>Notepadh1> <input v-model="todoName" placeholder="请输入任务" class="new-todo" /> <button @click="add" class="add">添加任务button> header> <section class="main"> <ul class="todo-list"> <li class="todo" v-for="(item,index) in list" :key="item.id"> <div class="view"> <span class="index">{{ item.id }}span> <label>{{ item.name }}label> <button @click="del(item.id)" class="destroy">button> div> li> ul> section> <footer v-show="list.length > 0" class="footer"> <span class="todo-count">合 计:<strong>{{list.length }}strong>span> <button @click="empty" class="clear-completed"> 清空任务 button> footer> section> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script> <script> const app = new Vue({ el: '#app', data: { todoName: '', list: [ { id: 1, name: '打篮球1小时' }, { id: 2, name: '跑步1小时' } ] }, methods: { // 得到id del(id) { // console.log(id) // 过滤符合条件的重新赋值给数组 this.list = this.list.filter(item => item.id !== id) }, add() { if (this.todoName.trim() === '') { alert('请输入任务名称') return } this.list.unshift({ id: +new Date(), name: this.todoName }) this.todoName = '' }, empty() { this.list = [] } } }) script>