【学习札记】Vue学习

1. 初始化

每个 Vue 应用都需要在script中通过实例化 Vue 来实现

参数:

  • el:DOM 元素中的 id;
  • data:定义属性;
  • method:定义函数。通过return返回值,可以直接在前端显示;
  • {{ }}:输出对象属性和函数返回值。
<script src="vue.min.js"></script>
<script>
    var view = new Vue({
        el: "#ID",
        data:{
            "name": "xhh",
            "age": 24
        },
        method: {
            func: function() {
                return this.name + ' is ' + this.age;
            }
        }
    })
</script>

<div id='ID'>
    <h1>{{name}}</h1>
    <h1>{{func()}}</h1>
</div>

2. 模板语法

Vue 使用了基于 HTML 的模板语法, 允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. 其核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统. 结合响应系统, 在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上.

2.1 插值

2.1.1 文本

数据绑定最常见的形式 --> {{  }}

<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg: 'hello'
        }
    })
</script>

<div id='app'>
    <p>{{ msg }}</p>
</div>

2.1.2 v-html指令

用于输出html代码

<script>
     new Vue({
        el: '#app',
        data: {
            msg: '<h1>hello xhh</h1>'
        }
    })
</script>

<div id='app'>
    <div v-html='msg'></div>
</div>

2.1.3 属性 v-bind指令

通过判断来决定某属性是否生效

<script>
    new Vue({
        el: '#app',
        data:{
          use: false
        }
    })
</script>

<div id="app">
    <label for="r1">修改颜色</label><input type="checkbox" v-model="use" id="r1">
    <div v-bind:class="{'class1': use}">
        class1 生效与否与use的boolen值有关
    </div>
</div>

2.1.4 表达式

Vue提供了完全的JS表达式支持

<script>
    new Vue({
        el: '#app',
        data: {
            ok: true,
            message: 'hello',
            id : 1
        }
    })
</script>

<div id="app">
    {{5+5}}<br>
    {{ ok ? 'YES' : 'NO' }}<br>
    {{ message.split('').reverse().join('') }}
    <div v-bind:id="'list-' + id">id为list-1的元素</div>
</div>

2.2 指令

指令是带有v-前缀的特殊属性, 用于在表达式的值改变时, 将某些行为应用到DOM上.

2.2.1 v-text

【string】更新元素的textContent, 其作用与{{  }}相同

<span v-text="msg"></span>
<span>{{ msg }}</span>

2.2.2 v-html

【string】更新元素的innerHTML, 前面做过叙述, 不再赘述.

2.2.3 v-show

【any】根据表达式的真假值, 切换元素的display, 当条件变化时该指令触发过渡效果. v-show的元素始终会被渲染并保留在DOM中

<h1 v-show="isShow">Hello!</h1>

2.2.4 v-if, v-else & v-else-if 

【any】根据表达式的真假值来有条件的渲染元素, 在切换元素及它的数据绑定/组件被销毁并重建. 当条件变化时该指令触发过渡效果. 内容只会在指令的返回表达式为truthy的时候被渲染. 

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

2.2.5 v-for

【array | object | number | string | iterable】 基于源数据多次渲染元素或模板块, 必须使用特定语法 lias in expression, 为当前遍历的元素提供别名.

  • 数组
    <ul id="array-rendering">
        <li v-for="item in items">
            {{ item.msg }}
        </li>
    </ul>
    
    <script>
        Vue.createApp({   
            data() {
                return {
                    items: [{msg: 'Foo'}, {msg: 'Bar'}]
                }
            }
        }).mount('#array-rendering')
    </script>
  • 对象
    <ul id="v-for-object">
        <li v-for="value in myObject">
            {{ value }}
        </li>
    </ul>
    
    <script>
        Vue.createApp({
            data() {
                return {
                    myObject: {
                        title: 'How to do lists in Vue',
                        author: 'Jane Doe',
                        publishedAt: '2016-04-10'
                    }
                }
            }
        }).mount('#v-for-object')
    </script>

 2.2.6 监听事件 v-on

【Function | Inline Statement | object】用v-on指令(简写@)来监听DOM事件, 并在触发事件时执行一些JS, #v-on: click="methodName" 或使用 @click="methodName"

<div id="basic-event">
    <button @click="counter += 1">Add 1</button>
    <p>The button above has been clicked {{ counter }} times.</p>
</div>

<script>
    Vue.createApp({
        data() {
            return {
                counter: 0
            }
        }
    }).mount('#basic-envent')
</script>
<div id="event-with-method">
    <button @click="greet">Greet</button>
</div>

<script>
    Vue.createApp({
        data() {
            return {
                name: 'xhh'
            }
        },
        methods: {
            greet(event) {
                alert('Hello ' + this.name + '!')
                if (event) {
                    alert(event.target.tagName)
                }
            }
        }
    }).mount('#event-with-method')
</script>

更多实例

<!-- 方法处理器 -->
<button v-on:click="doThis"></button>

<!-- 动态事件 -->
<button v-on:[event]="doThis"></button>

<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 动态事件缩写 -->
<button @[event]="doThis"></button>

<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>

<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>

<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter" />

<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>

<!-- 对象语法 -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>

2.2.7 v-bind

【any | object】(缩写 : 或 .)动态的绑定一个或多个attribute, 或一个组件prop到表达式. 在绑定class或style时, 支持其它类型的值, 如数组或对象. 在绑定prop时, prop 必须在子组件中声明.

<div
  class="static"
  :class="{ active: isActive, 'text-danger': hasError }"
></div>

<script>
    data() {
        return {
            isActive: true,
            hasError: false
        }
    }
</script>

<!--渲染结果-->
<div class="static active"></div>

当isActive 或 hasError 变化时, class列表将相应地更新.

2.2.8 v-model

{ input select textarea }在表单控件或组件上创建双向绑定. v-model 会忽略所有表单元素的value, checked, selected 等的初值. 它将始终将当前活动实例的数据作为数据来源. 在JS的 data 选项中声明初始值.

<div id="v-model-basic">
  <input v-model="message" placeholder="edit me" />
  <p>Message is: {{ message }}</p>
</div>

<script>
    Vue.createApp({
        data() {
            return {
                message: ''
            }
        }
    }).mount('#v-model-basic')
</script>

<!--textarea-->
<div id="v-model-textarea" class="demo">
    <span>Multiline message is:</span>
    <p style="white-space: pre-line;">{{ message }}</p>
    <br />
    <textarea v-model="message" placeholder="add multiple lines"></textarea>
</div>

<script>
    Vue.createApp({
        data() {
            return {
                message: ''
            }
        }
    }).mount('#v-model-textarea')
</script>

2.2.9 v-slot

【可放置在函数参数位置的JS表达式】(缩写#)实现了一套内容分发的 API, 这套 API 的设计灵感源自 Web Components 规范草案,  将 <slot> 元素作为承载分发内容的出口. 若模板中没有<slot>元素, 则该组件起始标签和结束标签之间的任何内容都会被抛弃.

<todo-button>
    add todo
</todo-button>

<!--todo-button template-->
<button class="btn-primary">
    <slot></slot>
</button>

<!--渲染结果-->
<button class="btn-primary">
    add todo
</button>

3. 计算属性 computed

当在处理一些复杂逻辑时很有用. 如 {{ msg.split('').reverse().join('') }}, 使用计算逻辑输出.

<div id="app">
    <p>原始字符串: {{ message }}</p>
    <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
    var vm = new Vue({
        el: '#app',
        data: {
          message: 'xuhaha'
        },
        computed: {
            reversedMessage: function () {
                return this.message.split('').reverse().join('')
            }
        }
    })
</script>

我们可以使用 methods 来替代 computed, 效果上两个都是一样的, 但是 computed 是基于它的依赖缓存, 只有相关依赖发生改变时才会重新取值. 而使用 methods, 在重新渲染的时候, 函数总会重新调用执行. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值