vue项目基础用法教程(一)

1. 什么是Vue.js?

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

2.安装n

安装vue-cli3 & node环境

全局安装
npm install -g @vue/cli
查看vue版本
vue -V
创建项目
vue create my-project
配置参考
进入项目
cd my-project
运行
npm run serve

3. Vue基本

基础vue文件

<template>
  <div class="container">
        {{ title }}
  </div>
</template>

<script>
import '';
import xx from '';

export default {
    name: 'test',
    // 父组件传值
    props: { // 入参
        title: {
          type: String,
          required: true,
        },
        dataArr: {
            type: Array,
            required: false,
            default() {
              return [];
            },
        }
    },
    data(){
        return {
            // 数据
        }
    }
    components:{
      // 组件注册
    },
    beforeCreate(){
      // 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。
    },
    create(){
      // 实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
    },
    beforeMount(){
      // 在挂载开始之前被调用:相关的 render 函数首次被调用。
    },
    mounted(){
      // el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
    },
    beforeUpdate(){
      // 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
    },
    updated(){
      // 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
      // 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环
    },
    beforeDestroy(){
      // 实例销毁之前调用。在这一步,实例仍然完全可用。 
    },
    destroyed(){
      // Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。
    },
    computed:{
      // 计算属性
    },
    watch:{
      // 数据监听
    },
    methods:{
      // 方法定义
    }
}

</script>

<style scoped>
@import "";

</style>

3.1 Vue的渲染方法

3.1.1 指令式渲染:
  1. v-html,v-text 采用{{}}语法==>插值运算
  2. v-html:它可以加标签,它会解析成html
  3. v-text:不能加标签,如果加了,它会当作字符串展示出来
3.1.2 插值表达式:

{{ data中的数据 }}

3.1.2 插值表达式:

{{ data中的数据 }}

3.1.3 v-html 与 v-text的区别:

v-html会解析html格式
v-text与插值表达式会把内容当做文本来解析
v-html 和 v-text都会覆盖元素中原有的内容

3.1.4 v-cloak 解决插值表达式闪烁的问题

并在css中设置:
[v-cloak]{ display: none; }
让所有设置 v-cloak 的元素隐藏,当加载完毕之后,元素身上的 v-cloak 就会消失。

3.1.5 条件指令 v-if 和 v-show

共同点:都是动态显示DOM元素
不同点:
v-if 是动态的向DOM树内添加或删除DOM元素,适用于运营条件不大可能改变。
v-show 是通过设置DOM元素的display实现控制显隐的,适合频繁切换。

3.1.6 循环指令 v-for

注意事项:key属性只能使用 number 或string,且是惟一的;key在使用的时候,必须使用 v-bind 属性绑定的形式,指定key的值
遍历数组 (item,index) in 数组名
遍历对象 (value,key) in 对象名,value是属性值,key是属性

3.1.7 动态属性 v-bind:class="a"

可以简写:class="a" ,v-bind可以省略

3.1.8 监听事件 v-on

v-on:click="事件名" 缩写@click="事件名

3.1.9 v-model 数据绑定

可以在表单中使用v-model实现数据双向绑定
{{value}} <input v-model="value" />

3.1.10 事件修饰符

v-on 事件修饰符
.stop 阻止冒泡
.prevent 阻止默认事件
.capture 添加事件监听器时使用事件捕获模式
.self 只当事件在该元素本身(比如不是子元素)触发是触发回调
.once 事件值触发一次

常用的生命周期函数

//在创建对象之前,监控数据变化和初始化事件之前调用
  beforeCreate() {
    console.log('beforeCreate 钩子执行...')
    console.log(this.number) //数据监测还没有开始
  },
  //实例创建完成之后调用,挂载阶段还没有开始
  // 数据初始化调取接口
  created() {
    console.log('cteated 钩子执行...')
    console.log(this.number)
  },
  //开始挂载的时候执行,这时html还没有渲染到页面上
  beforeMount() {
    console.log('beforeMount 钩子执行...')
    console.log(this.number)
  },
  //挂载完成,也就是模板中的heml渲染到了页面中,此时可以做一些ajax的操作,这个钩子函数只会执行一次
  // 初始化操作dom
  mounted() {
    console.log('mounted 钩子执行...')
    console.log(this.number)
  },
  //数据更新之前调用
  beforeUpdate() {
    console.log('beforeUpdate 钩子执行...')
    console.log(this.number)
  },
  //数据更新之后调用
  updated() {
    console.log('updated 钩子执行...')
    console.log(this.number)
  },
  //数据销毁之前
  beforeDestroy() {
    console.log('beforeDestroy 钩子执行...')
    console.log(this.number)
  },
  //数据销毁之后
  destroyed() {
    console.log('destroyed 钩子执行...')
    console.log(this.number)
  } ,
  // 被 keep-alive 缓存的组件会多两个生命周期activated、deactivated,
  //每次进入都会执行,用于页面缓存,但需要刷新数据。
  activated(){},
  // 当离开组件时,停止使用时调用,可用于清除定时器。
  deactivated(){}

filters过滤器

常用示例

template
  <span>{{ status | statusFilter}}</span>

script
  filters: {
    statusFilter(status) {
      const statusMap = {
        published: 'success',
        draft: 'gray',
        deleted: 'danger',
      }
      return statusMap[status]
    },
  },

watch监听

常用示例

template
  <input type="text" v-model="value"/>

script
   watch: {
    cityName(newName, oldName) {
      // ...
    }
  } 

computed 监听/计算属性

常用示例

template
  <span>{{ value }}</span>

script
 data(){
    return{
        num1: 10,
        num2: 20
    }
 },
 computed: {
    value() {
      return this.num1 + this.num2;
    }
  } 
   

Vue Router

基础用法

const routes = [
  { path: '/', component: () => import('@/views/xxx') },
  { path: '/home', component:() => import('@/views/xxxx') },
]
const router = new VueRouter({
  base: '',
  mode: 'hash',//路由模式,可选值为 history 或 hash
  scrollBehavior: () => ({
    y: 0,
  }),
  routes: routes,
})

export default router
路由出口
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
路由跳转
  1. 声明式
:to="" 可以实现绑定动态的 路由 和 参数
根据路由路径(/home)跳转 <router-link :to="{path: '/home', query:{id: 'abc'}}">点击查看子页面</router-link>
根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查看子页面</router-link>

2、编程式

this.$router.push({path: '/home',query:{id: 'abc'}})
this.$router.push({path: '/home',params:{id: 'abc'}})

params 和 query 传参的区别
1、params传参时,参数不会出现在url的路径上面,但是刷新页面时param里面的数据会消失
2、query传参时,参数出现在url的路径上面,刷新页面时query里面的数据不变

组件通信

1. 父组件向子组件传值

<!-父组件--->
<template>
  <div>
    <child :msg="msg"></child>
  </div>
</template>

<script>
import child from './child'
export default {
  components:{
    child
  }
  data () {
    return {
      msg: '父组件的值'
    }
  }
}

<!-子组件--->
<template>
  <div></div>
</template>

<script>
export default {
  props:{
      msg:{
          type:String,
          default:''
      }
  }
  mounted(){
      console.log(this.msg)
  }
}


2. 父组件调用子组件方法

<!-父组件--->
<template>
  <div>
    <child ref="child" ></child>
  </div>
</template>

<script>
import child from './child'
export default {
  components:{
    child
  }
  mounted(){
      this.$refs.child.getData() // 调用
  }
}

<!-子组件--->
<template>
  <div></div>
</template>

<script>
export default {
  methods:{
      getData(){
          console.log('父组件调用了我的方法')
      }
  }
}

3. 子传父值

<!-父组件--->
<template>
  <div>
    <child @func="getData"></child>
  </div>
</template>

<script>
import child from './child'
export default {
  components:{
    child
  }
  mounted(){
      getData(val){
          console.log(val) //我是子组件的数据
      }
  }
}

<!-子组件--->
<template>
  <div></div>
</template>

<script>
export default {
    data(){
        msg: "我是子组件的数据",
    }
    mounted(){
        //func: 是父组件指定的传数据绑定的函数,this.msg:子组件给父组件传递的数据
        this.$emit('func', this.msg)
     }
}


4. 父组件直接获取子组件里的data数据

<!-父组件--->
this.$ref.child.msg

5. 子组件调用父组件方法

<!-子组件--->
子组件直接通过this.$parent.event调用 //event为需要调用的父组件的事件

6. 子组件调用父组件方法2

子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了(与子组件向父组件传值(方法一)一致)

<!-父组件--->

<template>
  <div>
    <child @func="getData"></child>
  </div>
</template>
<script>
import child from './child'
export default {
  components:{
    child
  }
  methods:(){
      getData(){
          ///
      }
  }
}
</script>
<!-子组件--->
 this.$emit('func')

7.子组件调用父组件

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

<script>
import child from './child'
export default {
  components:{
    child
  }
  methods:{
      getData(){
        console.log('这是父组件的方法') 
      }
  }
}

<!-子组件--->
<template>
  <div></div>
</template>

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

推荐阅读更多精彩内容