VUE学习资源

VUE中国:https://cn.vuejs.org/

菜鸟教程:https://www.runoob.com/vue2/vue-tutorial.html

基于VUE的后台管理系统:https://github.com/PanJiaChen/vue-element-admin

基于VUE的表格组件:https://github.com/x-extends/vxe-table

基于vue2.0 +vuex+ element-ui后台管理系统:https://github.com/wdlhao/vue2-element-touzi-admin

基于 vue + element-ui 的后台管理系统:https://github.com/bailicangdu/vue2-manage

基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用:https://github.com/bailicangdu/vue2-elm

.NetCore+Vue,前后端分离,支持前后端业务代码扩展的快速开发框架 https://github.com/cq-panda/Vue.NetCore

好资源:http://www.bootstrapmb.com/

VUE拖拽组件:

http://www.ptbird.cn/vue-draggable-dragging.html

https://sortablejs.github.io/Vue.Draggable/#/custom-clone

需要区分注意的知识点:

props:(父->子,传递数据给子组件)

:props

:props.sync

:props:once

solt

events

$emit

@click

基本语法:

  • import:相当于c#中的using

import {模块或者变量名} from 'vue-count-to'
  • export:相当于c#中的public表示对外公开这个变量或者函数

  • export default:使用import命令时,用户必须知道并指定需要加载的变量或者函数,否则无法加载,所以用户必须了解模块的相关文档才能知道有哪些属性或者方法。为了给用户提供方便所以才有了export default
// export-default.js
export default function () {
  console.log('foo');
}

上面代码是一个模块文件,他的默认输出是一个函数。

  • VUE的引用方式:CDN和NPM方式

  • el:"#这里的值是是一个DOM节点,作为一个挂载目标"

  • data:{}:里面存放是数据

  • 双括号:插值、{{数据变量}}将数据挂载到DOM上,只支持表达式,不支持变量声明之类的语句

  上面说了,{{}}不支持语句只支持表达式,所以VUE提供了另一种指令的方式:v-if(条件渲染)或者v-else或者v-for(循环渲染)或者v-show之类的语句来实现

<div id="app">
    <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>
</div>
  • 指令:绑定变量(常用的指令v-bind 所以可以简化为 :)--------------指令(标志位):表示被标记了什么标记,VUE底层去做相应的逻辑处理

<a v-bind:href="url" v-bind:class="klass">click me</a>//直接绑定数据
<a v-bind:class="{active:isActive}">click me</a>//active表示要绑定的css类名,isActive是VUE中的数据,表示isActive为真时才添加

 

组件基础、组件注册

组件的意义:多次复用,减少重复带来的工作量

父子组件(子组件:组件模板,父组件:使用页面)

//父组件

<template>
 <div>
 <h1>我是父组件!</h1>
 <child></child>
 </div>
</template>
 
<script>
import Child from '../components/child.vue'
export default {
 components: {Child},
}
</script>

//子组件

<template>
 <h3>我是子组件!</h3>
</template>
 
<script>
</script>

父组件通过import的方式导入子组件,并在components属性中注册,然后子组件就可以用标签的形式嵌进父组件了。

props(父->子,传递数据给子组件)

父组件先绑定自定义属性=要传递的数据,子组件声明props:[父组件的自定义属性名]接受数据
注意传递参数时要用—代替驼峰命名,HTML不区分大小写

<template>
 <div>
 <h1>我是父组件!</h1>
 <child :my-message="message" mm="123"></child>
 </div>
</template>
 
<script>
import Child from '../components/child.vue'
export default {
     components: {Child},
     data() {
         return {
            msg: '我是子组件三!'+ Math.random()
         }
     }
}
</script>

子组件:

<template>
 <h3>{{myMessage}}</h3>
</template>

<script>
 export default {
     props: ['myMessage','mm']
      // // 方式二:指定数据类型与默认值
        // props: {
        //     myMessage: {
        //         type: Array,
        //         default: [5,6,7]  //指定默认的值
        //     }
        // }

</script>

VUE中$refs的基本用法:

  • ref加在普通元素上:用this.$refs.(ref值),获取到的是DOM元素
  • ref加在组件上:用this.$refs.(ref值),获取到的是组件实例,可以使用组件的所有方法(可以复用此方法将数据传递给组件)
<count-to
      ref="example"
      :start-val="_startVal"
      :end-val="_endVal"
      :duration="_duration"
      :decimals="_decimals"
      :separator="_separator"
      :prefix="_prefix"
      :suffix="_suffix"
      :autoplay="false"
      class="example"
    />

export default {
  name: 'CountToDemo',
  components: { countTo },
  data() {
    return {
          ...........
    }
  },
  computed: {
    ...........
  },
  methods: {
    start() {
      this.$refs.example.start()//这里调用了组件Count-to的实例方法
    },
    pauseResume() {
      this.$refs.example.pauseResume()//这里调用了组件Count-to的实例方法
    }
  }
}    

 

  • prop和ref之间的区别:

  prop 着重于数据传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。
  ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用(如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作  用与JQ选择器类似。),这个功能比作为索引更常有用到。

  • $emit(事件,值) (子->父,向父组件传入事件名称来触发一个事件)

  $emit 方法向父组件传入事件名称来触发一个事件,事件在父组件定义。
  e m i t 实 现 ∗ ∗ 子 组 件 向 父 组 件 通 信 ∗ ∗ 。 触 发 当 前 实 例 上 的 事 件 , 附 加 参 数 都 会 传 递 给 监 听 器 回 调 : 子 组 件 t h i s . emit 实现**子组件向父组件通信**。触发当前实例上的事件,附加参数都会传递给监听器回调:子组件this. emit

  :this.emit(evevt,arg),父组件@event=“XX” ,父组件methods:{XX(arg){}}。

父组件:

<template>
 <div>
 <h1>{{title}}</h1>
 <child  @returnBack="returnBack"></child>
 </div>
</template>
 
<script>
 import Child from '../components/child.vue'
 export default {
     components: {Child},
     data(){
          return{
              title:''
          }
     },
     methods:{
         returnBack() {
                //随便什么
            },
     }
 }
</script>

子组件:

<template>
<div class="header">
    <a class="backBtn" @click="returnBack"><i class="icon-back"></i></a>
    <h3 class="pageTitle">子组件标题}</h3>
</div>
</template>
<script>
 export default {
     methods: {
      returnBack(){
                this.$emit('returnBack')
            }
     }
 }
</script>

父组件用绑定属性的方式把方法传入子组件中 在子组件里直接调用这个方法(子->父)

<template>
  <div class="parent">
    <child :fatherMethod='fatherMethod'></child>// 父组件把方法传入子组件中,在子组件里直接调用这个方法
  </div>
</template>

<script>
    import child from '../base/child'
    
    export default {
        methods:{
            fatherMethod() {
                alert('我是父组件的know方法');
            }
        },
        components:{
            child
        }
    }
</script>
<template>
  <div class="child" @click='childClick'>
  </div>
</template>

<script>

    export default {
        props:{
            fatherMethod: {
                type: Function,
                default: null
            }
        },
        methods:{
            childClick(){
                this.fatherMethod()
            }
        }
    }
</script>

通过 $parent直接 获取父组件数据和调用父组件方法(子->父)

<template>
  <div class="parent">
    <child></child>
  </div>
</template>

<script>
    import child from '../base/child'
    
    export default {
        data() { // 组件的data必须是函数
          return {
            msg:'父组件数据测试'
          }
        },
        methods:{
          fatherMethod() {
            alert('我是父组件的方法')
          }
        },
        components:{
            child
        }
    }
</script>
<template>
  <div class="child" @click='childClick'>
  </div>
</template>

<script>

    export default {
        data() {
            return {  }
        },
        methods:{
            childClick(){
                this.$parent.fatherMethod()
                console.log(this.$parent.msg)
                }
        }
    }
</script>

< solt >插槽,承载分发内容的出口

Vue.component('Vbtn',{ template:'<div><button><solt></solt></button></div>'});
var  Vcontent={ 
    template:'<div><Vbtn>删除</Vbtn></div>'
}
var Vheader={
    template:'<div><Vbtn>播放</Vbtn></div>'
}

.native获取子组件的原生事件

var Vcontent={ 
    template:'<div><Vbtn @click.native='add'>删除</Vbtn></div>' ,
    methods:{
        add(){
            alert(1);
        }
    }
}

事件:

  • V-ON:使用此指令来监听事件(简写形式@click)
  • 事件方法的定义:定义在Method里面
  • 事件的类型:dom组件事件、自定义组件事件
  • 父子组件之间参数的传递:子组件传递数据给父组件使用$emit;子组件接收数据使用$on
  • 其他事件类型:阻止冒泡,键盘事件

v-model和v-bind区别

v-model用在表单中,实质是v-bind的语法糖,v-bind.

可以使用v-model或v-bind将输入框的value与app的某个变量进行绑定,但是,v-model实施的是双向数据绑定,即双方任何一方的变动都会同步变化到另一方,而v-bind实施的是单向数据流的绑定,可以动态更新HTML元素上的属性

原文地址:https://www.cnblogs.com/gougou1981/p/13143195.html