VUE常用知识点

Vue 基础篇

2019-02-14  本文已影响138人  CN_yang

Vue 基础篇

一、框架与库的区别

库:小而精

框架:大而全 ( 框架包含了各种库 )

二、起步

npm install --yes
npm install vue --save ( npm install vue -S )

三、指令 ( v-xxx )

<div class="container" :class="{active: true}"></div>
// 渲染为 DOM
<div class="container active"></div>
// html
<div class="container" @click="clickHandler"></div>
// js
methods:{
    clickHandler(e){
        console.log(this);
    }
}
<ul>
    <li v-for="item,index in list">
        {{index}}--{{item}}
    </li>
</ul>
<input v-model="msg">
// 等同于
<input :value="msg" @input="msg = $event.target.value" />

那么 v-model 其实就是 v-bindv-on 的语法糖。

四、组件

1.局部组件

局部组件使用打油诗:声子挂子用子

声明子组件;父组件挂载子组件;父组件使用子组件。

// 局部组件的声明
var App = {
    data(){
        return{

        }
    },
    template:`
        <div>我是入口组件</div>
    `
}
// vue实例
new Vue({
    el:"",
    data(){

    },
    // 挂载子组件
    components:{
        App
    },
    // 父组件直接可以使用
    template:`<App />`
})

组件命名:

​ 1.短横线分隔 命名:当引用组件时,也要使用 短横线分隔 形式。( 如: <my-compnent-name> )

​ 2.驼峰式命名:当引用组件时,可以使用 短横线分隔 形式或者 驼峰 形式。( 如: <my-compnent-name> 或 <MyCompnentName>)

​ [注]:直接在DOM( 即非字符串的模板 )中使用时只有 短横线分隔 形式是有效的。

​ [建议]:命名时用 驼峰 形式,使用时用 短横线分隔 形式。

2.全局组件

Vue.component("组件名", options)

// 全局组件声明
// 第一个参数是组件的名字,第二个参数是options配置项
Vue.component("Vbtn", {
    template:`
        <button>按钮</button>
    `
})
// 全局组件使用
var App = {
    template:`
        <div>
            ...
            <Vbtn />
        </div>
    `
}

五、组件通信

1.通过 prop 往子组件通信
Vue.component("Parent", {
    data(){
        return{
            msg:"我是父组件的数据"
        }
    },
    template:`
        <div>
            <p>我是父组件</p>
            <Child :childData="msg" />
        </div>
    `
})
Vue.component("Child", {
    template:`
        <div>
            <p>我是子组件</p> 
            <input type="text" v-model="childData" />
        </div>
    `,
    props:["childData"]
})
2.通过 事件 向父组件发送消息
// Child
Vue.component("Child", {
    template:`
        <div>
            <p>我是子组件</p> 
            <input type="text" v-model="childData" @input="changeValue(childData)" />
        </div>
    `,
    props:["childData"],
    methods:{
        changeValue(val){
            // 自定义的事件一定要通过 this.$emit() 去触发
            // $emit("自定义的事件名", "消息")
            this.$emit(childHandler, val)
        }
    }
})

// Parent
Vue.component("Parent", {
    data(){
        return{
            msg:"我是父组件的数据"
        }
    },
    template:`
        <div>
            <p>我是父组件</p>
            <Child :childData="msg" @childHandler="childHandlerFn" />
        </div>
    `,
    methods:{
        childHandlerFn(val){
            console.log(val);
        }
    }
})

六、插槽 slot

插槽:内置组件 slot,作为承载分发内容的出口

/* 模拟 elementUI 按钮组件的实现 */
// 子组件
Vue.component("Vbtn", {
    template:`
        <button class="default" :class="type">
            <slot>按钮</slot>
        </button>
    `,
    props:["type"]
})

// 父组件
var App = {
    template:`
        <div>
            ...
            <Vbtn type="primary">登陆</Vbtn>
            <Vbtn type="success">注册</Vbtn>
        </div>
    `
}
具名插槽
// 子组件
Vue.component("liItem", {
    template:`
        <li>
            第一个槽
            <slot name="idx-1"></slot>
            第二个槽
            <slot name="idx-2"></slot>
        </li>
    `
})

// 父组件
var App = {
    template:`
        <div>
            <ul>
                <liItem>
                    <h1 slot="idx-1">我是第一个槽</h1>
                    <h3 slot="idx-2">我是第二个槽</h3>
                </liItem>
            </ul>
        </div>
    `
}

七、过滤器

/* 局部过滤器 */
// 1.声明过滤器
// 2. {{ 数据 | 过滤器的名字 }}
var App = {
    data(){
        return{
            price:0,
            msg:"hello filter"
        }
    },
    template:`
        <div>
            <input type="number" v-model="price" />
            <!-- 使用过滤器 -->
            <h2>{{ price | myCurPrice }}</h2>
            <h3>{{ price | myReverse }}</h3>
        </div>
    `,
    filters:{
        // 声明过滤器
        myCurPrice: function(val){
            return "¥" + val
        }
    }
}

/* 全局过滤器 */
// 字符串反转过滤器
Vue.filter("myReverse", function(val){
    return val.split("").reverse().join("");
})

{{ 数据 | 过滤器的名字(可以传值) }}

例:

​ {{ price | myReverse("这里是传入的值") }}

​ // 其中 arg 就是传入的值

​ Vue.filter("myReverse", function(val, arg){
​ return val.split("").reverse().join("");
​ })

八、watch 监听

watch 监听的是单个属性

基本的数据类型 -- 简单监视

复杂的数据类型 -- 深度监视

new Vue({
    el:"",
    data(){
        return{
            msg : ''
        }
    },
    watch:{
        msg: function(newVal, oldVal){
            console.log(newVal, oldVal);
        }
    }
})
new Vue({
    el:"",
    data(){
        return{
            userList : [{name:"jack"}]
        }
    },
    watch:{
        userList: {
            deep:true, // 深度监视
            handler: function(newVal, oldVal){
                console.log(newVal, oldVal);
            }
        }
    }
})

九、计算属性

// html
<img :src="getCurSrc" />
<ul>
    <li v-for="item,index in dataList" @click="clickHandler(index)" :class="{active: curIdx == index}">{{ index }}</li>
</ul>

// js
new Vue({
    el:"",
    data(){
        return{
            dataList:[{imgsrc:'1'},{imgsrc:'2'},{imgsrc:'3'}],
            curIdx : 0
        }
    },
    computed:{
        // 计算属性默认只有 getter
        getCurSrc: function(){
            return this.dataList[this.curIdx].imgsrc
        }
    },
    methods:{
        clickHandler(index){
            this.curIdx = index;
        }
    }
})
// js
new Vue({
    computed:{
        getCurSrc: {
            set: function(newVal){
                console.log(newVal);
                this.curIdx = newVal;
            },
            get: function(){
                return this.dataList[this.curIdx].imgsrc
            }
        }
    },
    methods:{
        clickHandler(index){
            // 点语法 set方法 和 get方法
            // getter 方法
            console.log(this.getCurSrc);
            // 调用set方法
            this.getCurSrc = index;
        }
    }
})

十、生命周期

vue 内置组件 <keep-alive></keep-alive>:能在组件的切换过程中将状态保留在内存中,防止重复渲染DOM。

生命周期图
上一篇下一篇

猜你喜欢

热点阅读