Vue 基础入门

Vue HTML 指令

<div v-text="name">渲染文本</div>
<div v-html="html">渲染 HTML</div>
<div v-bind:id="id">动态属性绑定</div>
<div :id="id">动态属性绑定简写</div>
<div>{{可以写表达式}}</div>
<div v-show="true">显示隐藏</div>
<div v-if="error">显示隐藏</div>
<div v-once>只渲染一次</div>
<div :[key]="vaule">动态属性名绑定</div>
<div v-on:click="add">设置事件(点击)</div>
<div @click="add">设置事件(点击)简写</div>
<div @[key]="add">设置动态事件</div>
<div @click.prevent="add">修饰符,阻止默认行为</div>
<div @click="add($event,30)">参数传递</div>

Vue JavaScript 代码

const app = Vue.createApp({
    data() { // 数据
        return {
            numberA: 1,
            numberB: 2,
            tip: ''
        }
    },
    watch: { // 监听   
        numberA(newValue, oldValue) {
            console.log('number', newValue, oldValue)
        },
        numberB(newValue, oldValue) {
            console.log('number', newValue, oldValue)
        }
    },
    computed: { // 计算属性
        errorA() {
            const message = this.number == 0 ? '不小于 0' : (this.number == 10 ? '不大于10' : '')
            if (message) return this.tip + message
        },
        errorB: {
            get() {
                const message = this.number == 0 ? '不小于 0' : (this.number == 10 ? '不大于10' : '')
                if (message) return this.tip + message
            },
            set(tip) {
                this.tip = tip
            }
        }
    },
    methods: { // 方法
        add(event) {
            this.error = '提示:'
            if (this.number < 10) this.number++
        },
        desc(event) {
            this.error = '警告:'
            if (this.number > 0) this.number--
        }
    }
})
const vm = app.mount('#app') 

Vue 动态样式

<div class="sa" :class="{ colorA: action, backerA: action }">{{ title }}</div>
<div class="sa" :class="['colorA','backerA']">{{ title }}</div>
<div class="sa" :class="[{colorA:action,backerA:action}]>{{ title }}</div>
export default {
    data() {
        return {
            classListA: {
                currentA: true,
                saA: true
            }
            classListB:{
                currentB: true,
                saB: true
            }
        }
    },
    computed:{
          classListC(){
            return{
                currentB: true,
                saB: true
            }
        }
    }
}

组件样式与 Style 行级样式

在组件内部有多个组件的情况下,选择默认的接受样式的节点

<section :class="$attrs.class"></section>

意识到样式也是可以绑定的就行

<section :style="style">Good</section>

v-if 与 v-show 使用区分

<template>
    <template v-for="(lesson, index) in lessons" :key="index">
        <div v-if="lesson.isDelete" :style="style">{{ lesson.name }}</div>
        <div v-else>{{ lesson.name }}</div>
    </template>
</template>

v-if 不渲染 Dom 元素,v-show 通过样式控制。

v-show 不能使用在 template 之上

v-for 使用细节

可以遍历纯数字、数组、对象

小案例

<template>
    <div class="A">
        <button @click="this.orderBy = 'fraction'" 
        :class="{ 'orderBy': orderBy == 'fraction' }">分数</button>
        <button @click="this.orderBy = 'good'" 
        :class="{ 'orderBy': orderBy == 'good' }">善良值</button>
        <button @click="this.orderType = 'asc'" 
        :class="{ 'orderType': orderType == 'asc' }">升序</button>
        <button @click="this.orderType = 'desc'" 
        :class="{ 'orderType': orderType == 'desc' }">降序</button>
        {{ orderBy }}
        {{ orderType }}
        <template v-for="lesson in lessonLists" :key="lesson.id">
            <div class="name">{{ lesson.name }} - fraction:{{ lesson.fraction }} - good:{{ lesson.good }}</div>
        </template>
    </div>
</template>
<script>
export default {
    data() {
        return {
            lessons: [
                { id: 1, name: 'XiaoHong', isDelete: true, fraction: 75, good: 2134 },
                { id: 2, name: 'xiaoLv', isDelete: false, fraction: 180, good: 3672 },
                { id: 3, name: 'xiaoGang', isDelete: true, fraction: 90, good: 1343 }
            ],
            orderBy: 'fraction',
            orderType: 'asc'
        }
    },
    computed: {
        lessonLists() {
            return this.lessons.sort((a, b) => {
                if (this.orderType == 'asc') {
                    return a[this.orderBy] - b[this.orderBy]
                } else if (this.orderType == 'desc') {
                    return b[this.orderBy] - a[this.orderBy]
                } else {
                    console.log('排序异常')
                }

            })
        }
    }
}
</script>
<style scoped>
.orderBy {
    background-color: red;
}

.orderType {
    background-color: aqua;
}
</style>

关于 event 事件

<button @click="this.orderBy = 'fraction', sum($event, 1, 2, 3)"
        >FractionShort</button>
methods: {
    sum(event, ...args) {
        console.log(event)
    }
},

事件修饰符

@click.stop  //阻止单击事件继续传播
@click.capture //添加事件监听器时使用事件捕获模式,即内部元素触发的事件先在此处理,然后才交由内部元素进行处理。
@click.stop.prevent //修饰符可以串联
@click.self //只当在 event.target 是当前元素自身时触发处理函数,即事件不是从内部元素触发的。
@click.once //只执行一次
@click.passive //无视所有默认行为的拦截,即不判断代码部分是不是有拦截。
@submit.prevent //提交事件不再重载页面
// ctrl alt shift meta
// enter esc space delete up down left right
@keyup.esc //按下特定按键触发
@click.alt.exact //按住特定按键,点击鼠标触发

表单操作

<input type="checkbox" v-model="afIsPost" true-value="yes" false-value="no">
<input type="checkbox" v-model="afLesson" value="PHP">PHP
<input type="checkbox" v-model="afLesson" value="Linux">Linux
<input type="radio" v-model="afRadio" value=""><input type="radio" v-model="afRadio" value=""><input type="radio" v-model="afRadio" value="🏳️‍🌈">🏳️‍🌈
<select v-model="afCaty" multiple>
    <option value>请选择</option>
    <option value="BeiJing">北京</option>
    <option value="ShangHai">上海</option>
    <option value="WuHan">武汉</option>
</select>
<input type="text" v-model.lazy="afgoodA"> <!-- 光标离开后才处理 -->
<input type="text" v-model.number="afgoodB"><!-- 设置值为数字 -->
<input type="text" v-model.trim="afgoodC"><!-- 去除两端空格 -->