Vue.js

2021-11-05  本文已影响0人  甄子健
Vue.js 核心特性

数据驱动视图

优点

组件化开发

基础语法

Vue实例

    var vm = new Vue({
        // 选项对象
    })

el选项

    var vm = new Vue({});
    vm.$mount('#app');
插值表达式
data选项
    console.log(vm.$data.title)
    console.log(vm.title)
Vue.set(vm.contentArr, 0, '生效的新内容')
methods 选项
    var vm = new Vue({
        el: '#app',
        data: {
            title: 'a-a-a-a'
        },
        methods: {
            fn (value) {
                return value.split('-').join('');
            }
        }
    })
Vue.js 指令

Vue.js 的指令就是以v-开头的自定义属性

v-once 指令

        <p v-once>{{title}}</p>

v-text 指令

<body>
    <p v-text="100">aaa</p>
    <p v-text="content">aaa</p>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            content: '内容文本'
        },

    })
</script>

v-html指令

<body>
    <p v-html="content">aaa</p>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            content: '<span>111</span>'
        },

    })
</script>

属性绑定 v-bind 指令

    <p v-bind:titlt="title">标签内容</p>

    <!-- 简写 -->
    <p :title="title">标签内容</p>
<body>
    <p v-bind="attrObj">p标签的内容</p>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            attrObj: {
                id: 'box',
                title: '实例内容',
                'data-title': 'data-title'
            }
        }
    });
</script>

属性绑定 class绑定

<body>
    <p v-bind:class="cls">标签内容</p>
    <p class="a" :class="cls">标签内容</p>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            cls: 'x',
        }
    });
</script>
<body>
    <p :class="{ b:isB, c: isC, 'class-d': true }"></p>
    <p :class="['a', {b: isB} ,'c']"></p>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            isB: true,
            isC: false
        }
    });

属性绑定 style绑定

<body>
    <div id="app">
        <p :style="styleObj">标签内容</p>
        <p style="width: 100px;" :style="styleObj">标签内容</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            styleObj: {
                width: '200px',
                height: '100px',
                border: '1px solid #ccc',
                'font-size': '30px'
            }
        }

    });
</script>
<p style="width: 100px;" :style="[styleObj, styleObj2]">标签内容</p>

v-for 指令

<body>
    <div id="app">
        <ul>
            <li v-for="item in arr">{{item}}</li>
        </ul>
        <ul>
            <li v-for="value in obj">{{value}}</li>
        </ul>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            arr: ['1', '2', '3'],
            obj: {
                content1: '1',
                content2: '2',
                content3: '3'
            }
        }
    });
</script>
<body>
    <div id="app">
        <li v-for="(item, id) in itemList" :key="item.id">
            输入框{{ item.value }}: <input type="text">
        </li>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            arr: [1, 2, 3],
            itemList: [
                {
                    id: 1,
                    value: 2
                },
                {
                    id: 2,
                    value: 3
                },
                {
                    id: 3,
                    value: 4
                }
            ]
        }
    })
</script>

v-show指令

    <div id="app">
        <p v-show="true">这个元素会显示</p>
        <p v-show="false">这个元素会隐藏</p>
    </div>

v-if 指令

<body>
    <div id="app">
        <p v-if="false">这是标签内容</p>
        <p v-else-if="true">1111</p>
        <p v-else-if="true">1111</p>
        <p v-else>最后一个p标签</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            bool: true
        }
    })
</script>
事件与表单处理

事件处理
v-on 指令

<body>
    <div id="app">
        <p>{{content}}</p>
        <button v-on:click="content='新内容'">按钮</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            content: '默认内容'
        }
    })
</script>
    <div id="app">
        <p>{{ content }}</p>
        <button @click="content='新内容'">按钮</button>
    </div>
<body>
    <div id="app">
        <p>{{ content }}</p>
        <button v-on:click="fn">点击修改内容</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            content: 'aaa'
        },
        methods: {
            fn() {
                this.content = '新内容';
            }
        }
    })
</script>
<body>
    <div id="app">
        <p>{{ content }}</p>
        <button @click="fn(content, $event)">点击修改内容</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            content: 'aaa'
        },
        methods: {
            fn( content, event ) {
                console.log(content);
                console.log(event);
            }
        }
    })
</script>

表单输入绑定 v-model 指令

<body>
    <div id="app">
        <p>元素内容为:{{value}}</p>
        <input type="text" v-model="value">
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            value: ''
        }

    })
</script>

输入框绑定

<body>
    <div id="app">
        <p>input 内容为:{{value1}}</p>
        <input type="text" v-model="value1">

        <p>textarea 内容为:{{value2}}</p>
        <textarea v-model="value2"></textarea>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            value1: '',
            value2: ''
        }
    });
</script>

单选按钮绑定

<body>
    <div id="app">
        <p>radio数据为:{{ value3 }}</p>
        <input type="radio" id="one" value="1" v-model="value3">
        <label for="one">选项一</label>
        <input type="radio" id="one" value="2" v-model="value3">
        <label for="two">选项一</label>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            value3: ''
        }
    });
</script>

复选框绑定

<body>
    <div id="app">
        <p>单个checkbox选中的数据为: {{ value4 }}</p>
        <input type="checkbox" id="item" value="选项内容" v-model="value4">
        <label for="item">选项</label>

        <p>多个checkbox选中的数据为: {{ value5 }}</p>
        <input type="checkbox" id="one" value="选项一内容" v-model="value5">
        <label for="one">选项一</label>
        <input type="checkbox" id="two" value="选项二内容" v-model="value5">
        <label for="two">选项二</label>

    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            value4: '',
            value5: []
        }
    });
</script>

选择框绑定

<body>
    <div id="app">
        <p>单选select数据为: {{ value6 }}</p>
        <select v-model="value6">
            <option value="">请选择</option>
            <option value="1">选项一</option>
            <option value="2">选项二</option>
            <option value="3">选项三</option>
        </select>

        <p>多选select数据为: {{ value7 }}</p>
        <select v-model="value7" multiple>
            <option value="1">选项一</option>
            <option value="2">选项二</option>
            <option value="3">选项三</option>
        </select>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            value6: '',
            value7: []
        }
    });
</script>

小结

修饰符
修饰符是以点开头的指令后缀,用于给当前指令设置特殊操作

pervent 修饰符

<body>
    <div id="app">
        <a @click.prevent="fn" href="https://www.baidu.com">baidu</a>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            fn(){
                console.log("这是 a 标签的点击事件")
            }
        }
    });
</script>

stop 修饰符

<body>
    <div id="app">
        <div @click="fn1">
            <button @click.stop="fn2">按钮</button>
        </div>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {

        },
        methods: {
            fn1() {
                console.log('div 的点击事件')
            },
            fn2() {
                console.log('button 的点击事件')
            }
        }
    })
</script>

once 修饰符

<body>
    <div id="app">
        <button @click="fn">按钮1</button>
        <button @click.once="fn">按钮2</button>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {

        },
        methods:{
            fn() {
                console.log('按钮被点击了')
            }
        }
    })
</script>

按键修饰符
按键码

特殊按键

<body>
    <div id="app">
        <input type="text" @keyup.49="fn">
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {

        },
        methods: {
            fn() {
                console.log('输入了对应内容')
            }
        }
    })
</script>

系统修饰符
.ctrl
.alt
.shift

<body>
    <div id="app">
        <input type="text" @keyup.ctrl.q="fn" v-model="inoutValue">
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            inputValue:''
        },
        methods: {
            fn(event){
                this.inputValue = '';
            }
        }
    })
</script>

鼠标按键修饰符

        <button @click.left="fn"></button>
        <button @click.right="fn"></button>
        <button @click.middle="fn"></button>

v-model 修饰符
.trim 修饰符

<body>
    <div id="app">
        <input type="text" v-model.trim = "inputValue">
        <p>{{ inputValue }}</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            inputValue: ''
        }
    })
</script>

lazy 修饰符

<body>
    <div id="app">
        <input type="text" v-model.lazy="inputValue">
        <p>{{ inputValue }}</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            inputValue: ''
        }
    })
</script>

number 修饰符

<body>
    <div id="app">
        <input type="text" v-model.number="inputValue">
        <p>{{ inputValue }}</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            inputValue: ''
        }
    })
</script>
自定义指令

指令用于简化 DOM 操作,相当于对基础 DOM 操作的一种封装
当我们希望使用一些内置指令不具备的DOM功能时,可以进行自定义指令设置

自定义全局指令

<body>
    <div id="app">
        <input type="text" v-focus>
    </div>
</body>
<script>
    // 自定义全局指令
    Vue.directive('focus', {
        inserted (el){
            el.focus
        }
    })
    var vm = new Vue({
        el: '#app',
        data: {

        }
    })
</script>

自定义局部指令

<body>
    <div id="app">
        <input type="text" v-foucs>
    </div>
</body>
<script>

    var vm = new Vue({
        el: '#app',
        data: {

        },
        directives: {
            focus: {
                inserted (el) {
                    el.focus();
                }
            }
        }
    })
</script>
过滤器

用于进行文本内容格式化处理
过滤器可以在插值表达式和 v-bind 中使用
全局过滤器

<body>
    <div id="app">
        <p v-bind:title="value | filterA">这是标签</p>
    </div>
</body>
<script>
    // 设置全局过滤器
    Vue.filter('filterA', function (value) {
        console.log(value);
        return value.split('-').join('')
    });

    var vm = new Vue({
        el: '#app',
        data: {
            value: 'a-b-c'
        }
    })
</script>
<body>
    <div id="app">
        <p v-bind:title="value | filterA | filterB">这是标签</p>
    </div>
</body>
<script>
    // 设置全局过滤器
    Vue.filter('filterA', function (value) {
        console.log(value);
        return value.split('-').join('')
    });

    Vue.filter('filterB', function (value) {
        console.log(value);
        return value[0].toUpperCase() + value.slice(1);
    });

    var vm = new Vue({
        el: '#app',
        data: {
            value: 'a-b-c'
        }
    })
</script>
<body>
    <div id="app">
        <p v-bind:title="value | filterA | filterB">这是标签</p>

        <p>{{ value | filterC(100, 200) }}</p>
    </div>
</body>
<script>
    // 设置全局过滤器
    Vue.filterC('filterC', function (par1, par2, par3) {
        return par2 + par1.spilt('-').join('');
    })

    var vm = new Vue({
        el: '#app',
        data: {
            value: 'a-b-c'
        }
    })
</script>

局部过滤器

<body>
    <div id="app">
        <p>{{ content | filterA }}</p>
    </div>
</body>
<script>
    // 设置局部过滤器
    var vm = new Vue({
        el: '#app',
        data: {
            content: 'a-b-c'
        },
        filters: {
            filterA: function (value) {
                value.split('-').join();
            }
        }
    })
</script>
计算属性
<body>
    <div id="app">
        <p>{{ getResult }}</p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            arr: [1, 2, 3, 4, 5]
        },
        methods: {
            getSum () {
                var arr = this.arr;
                var sum = 0;
                for( var i = 0; i < arr.length; i++){
                    sum += arr[i];
                }
                return sum;
            }
        },
        computed: {
            getResult () {
                var arr = this.arr;
                var sum = 0;
                for( var i = 0; i < arr.length; i++){
                    sum += arr[i];
                }
                return sum;
            }
        }
    })
</script>

methods 与 computed 区别

计算属性的 setter

<body>
    <div id="app">
        <p>
            {{ fullName }}
        </p>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            firstName: '张',
            lastName: '三'
        },
        methods: {

        },
        computed: {
            //   默认书写方式
            // fullName () {
            //     return this.firstName + this.lastName
            // }
            // 分开书写 getter 与 setter
            fullName: {
                get () {
                    return this.firstName + this.lastName;
                },
                set (nemValue) {
                    var nameArr = newValue.split(' ');
                    this.firstName = nameArr[0];
                    this.lastName = nameArr[1]
                }
            }
        }
    })
</script>
侦听器
<body>
    <div id="app">
        <input type="text" v-model="value">
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            title: '这是内容',
            obj: {
                content1: '内容1',
                content2: '内容2'
            }
        },
        watch: {
            title (val, oldVal) {
                console.log('title');
            },
            obj: {
                deep: true,
                handler() {
                    console.log('obj 被修改了')
                }
            }
        }
    });
</script>

注意
当更改数组或对象时,回调函数中的新值与旧值相同,因为它们的引用都指向同一个数组、对象
数组操作不要使用索引与length,无法触发侦听器函数

Vue DevTools
上一篇 下一篇

猜你喜欢

热点阅读