vue

vue三大特点

  • 数据双向绑定
  • 组件化
  • 单文件组件-js/css/html存在于一个文件内(webpack+vue-loader)

vue实例对象

  • el:对象装载的位置
  • template:html代码片段
  • data:数据会被代理到实例对象
  • components:引入组件

vue生命周期

vue组件

  • 全局注册组件
Vue.component('my-header',{
    template:'<div></div>',
    data:{
    }
})
  • 局部注册组件
var myHeader = {
    template:'<div></div>',
    data:{
    }
}
new Vue({
    el:'#app',
    data:{},
    compentnes:{
        'my-header':myHeader
    }
})
  • 避免data直接赋值,那么文件里有两个A组件,其中一个修改了a值,另一个也会受影响
// 错误
data:{
    a:1
}
// 正确
data:function(){
    return{
        a:1
    }
}

vue基础

  • v-html/v-text/{{}}

    • v-text 会把标签转为字符串
    • v-html 可以识别html标签
  • v-for 可进行数组渲染,也可进行对象渲染

  • 列表数据的同步更新方法

    • 数组的push/pop/shift/unshift/splice/sort/reverse方法都会起出发视图更新
    • 数组的filter/concat/slice不会改变原数组,因此不会触发视图更新
    • 直接修改数组内容不会触发视图更新
    a =  [1,2];
    a[1]=3// 不会监听到修改
    Vue.set(this.a,1,3);
    // 对象属性同理
    Vue.set(this.list,1,{.....})
    
  • 标签属性

    • v-bind绑定的标签属性为动态绑定
    • v-show标签存在文档流,但是display:none
    • v-if标签在文档流中删除
  • 事件绑定

    • v-on:事件名,简写为@事件名
  • 表单事件

    • v-model:数据双向绑定
      • .lazy enter或blur时进行更新
      • .number 把value变为数字
      • .trim 删除前后空格
    • type
      • checkbox(和label一起使用)
      • radio(和label一起使用)
  • 计算属性 computed

  • 数据监听 watch

Vue父子组件

  • 插槽 slot
    • 匿名slot
    • 具名slot
  • 组件通信
    • 父组件->子组件 props
    • 子组件->父组件 emit事件
  • 动态组件 :is

Vue动画

  • transition标签

    • css过渡


    <transition name="my-trans">
        <p v-show="show">Demo</p>
    </transition>
    <style>
        .my-trans-enter-active,.my-trans-leave-active{
            transition:opacity 0.5s ease-out;
        }//指定过渡阶段的样式
        .my-trans-enter,.my-trans-leave-active{
            opacity:0;
        }
    </style>
    
    • js过渡 通过方法

Vue自定义指令

v-xxx="value"; 
directives:{
    xxx:function(el,binding){
        //el为当前绑定指令的元素
        //binding为接受的value
    }
}

vue-router

  • npm install vue-router
  • 在入口文件引入vue-router
import VRouter from 'vue-router'
Vue.use(VRouter)
let router = new VRouter({
    routes:[
        {
            path:'/apple',
            component:Apple
        },
        {
            path:'/banana',
            component:Banana
        },
    ]
})
new Vue({
    el:'#app',
    router,
    template:'<App/>'
    components:{App}
})
//在模板里设置vue-router
<router-view></router-view>
<router-link :to="{path:'apple'}">to Apple</router-link>
  • 路由参数
let router = new VRouter({
    routes:[
        {
            path:'/apple/:color',
            component:Apple
        },
        {
            path:'/banana',
            component:Banana
        },
    ]
})
// 通过this.$route.params来获取路由参数
  • 嵌套路由
let router = new VRouter({
    routes:[
        {
            path:'/apple',
            component:Apple,
            children:[
                {
                    path:'red',
                    component:RedApple
                },
                {
                    path:'green',
                    component:GreenApple
                },
            ]
        },
        {
            path:'/banana',
            component:Banana
        },
    ]
})
<router-link :to="{path:'apple/red'}">to Apple</router-link>
  • 命名路由
let router = new VRouter({
    routes:[
        {
            path:'/apple',
            component:Apple,
            name:'applePage'
        },
        {
            path:'/banana',
            component:Banana
        },
    ]
})
<router-link :to="{name:'applePage'}">to Apple</router-link>
  • 路由重定向
let router = new VRouter({
    routes:[
        {
            path:'/',
            redirect:'/apple'
        },
        {
            path:'/apple',
            component:Apple,
            name:'applePage'
        },
        {
            path:'/banana',
            component:Banana
        },
    ]
})
  • 路由动画
<transition name="fade">
    <keep-alive>
        <router-view></router-view>
    </keep-alive>
</transition>

vuex状态管理

  • action触发mutations,mutations修改state
  • action异步,mutation同步
  • getters获取状态集数据
// npm install vuex
import Vuex from 'vuex'
Vue.use(Vuex);
let store = new Vuex.store({
    state:{
        totalPrice:0
    },
    mutations:{
        increment(state,price){
            state.totalPrice += price;
        },
        decrement(state,price){
            state.totalPrice -= price;
        }
    },
    action:{
        increase(){context,price}{
            context.commit('increment',price);
        }
    }
})
new Vue({
    el:#app,
    store,
    methods:{
        addOn(price){
            this.$store.dispatch('increase',price)
        }
    }
})

父子组件间传值

  • 父组件向子组件传值
    • 子组件在props中创建一个属性,用以接收父组件传过来的值
    • 父组件中注册子组件
    • 在子组件标签中添加子组件props中创建的属性
    • 把需要传给子组件的值赋给该属性
// App.vue
// 父组件要引用子组件
// 父组件模板可以直接向子组件传值
<template>
  <div id="app">
    <Son :tell_son="sendMsgToSon"></Son>
  </div>
</template>

<script>
import Son from './components/Son.vue';
export default {
  name: 'App',
  data(){
    return{
      sendMsgToSon:'Msg From Dad'
    }
  },
  components: {
    Son
  }
}
</script>

// Son.vue
// 子组件通过props获取父组件传的值
<template>
    <div>
        <h1>{{ tell_son }}</h1>
    </div>
</template>

<script>
    export default {
        name: 'Son',
        data () {
            return {
            }
        },
        props:['tell_son']
    }
</script>
  • 子组件向父组件传值
    • 子组件中需要以某种方式例如点击事件的方法来触发一个自定义事件
    • 将需要传的值作为$emit的第二个参数,该值将作为实参传给响应自定义事件的方法
    • 在父组件中注册子组件并在子组件标签上绑定对自定义事件的监听
// Child.vue
// 子组件通过$emit来向父组件传值
<template>
    <div>
        <button @click="sendMsgToFather">点击发送信息给父组件</button>
    </div>
</template>

<script>
    export default {
        name: 'Child',
        data () {
            return {
            }
        },
        methods:{
            sendMsgToFather(){
                this.$emit('tell_dad','Msg From Child');
            }
        }
    }
</script>

// 父组件通过on来获取信息
<template>
  <div id="app">
    <p>来自子组件的信息{{receiveMsgFromSon}}</p>
    <Child v-on:tell_dad="receiveMsg"></Child>
  </div>
</template>

<script>
import Child from './components/Child.vue'

export default {
  name: 'App',
  data(){
    return{
      receiveMsgFromSon:''
    }
  },
  components: {
    Child
  },
  methods:{
    receiveMsg(data){
      this.receiveMsgFromSon = data;
    }
  }
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容