VUE阶段性总结

318 阅读2分钟

vue基础

1.vue中双括号的内容不支持语句但是可以支持表达式

<!-- error -->
<span>{{console.log('hahah')}}</span>
<!-- 反转字符串 -->
<span>{{message.split('').reverse().join('')}}</span>

2.v-bind加了之后就会把字符串解析成变量

v-bind:id="message"//这里的message不是字符串而是一个data中的变量的名字。

3.在双大括号中是不能使用语句的,所以vue提供了在模板中使用语句的方式:v-if,v-else;

4.插槽

插槽是传递复杂内容的一种方式。插槽决定了子组件中的标签插在子组件模板的什么位置。

5.计算属性

计算属性,可以看成data中的数据,只不过这个数据不是直接写在data中的而是通过data中的属性间接计算得到的,这个属性和data中的属性用起来没有什么区别(我暂时是这样理解的)都可以在模板中通过双大括号来使用,也可以在methods中通过this引用。与这个特点很相似的还有父子组件通信的props中的属性,也是这样使用的。示例代码如下:

computed:{
        fullName: function(){
            return this.firstName+' '+this.lastName;
        }
    }

6.侦听属性:就是对data中的数据或者props中的数据,或者计算属性进行侦听,如果变化,就执行某种操作。示例代码如下:

watch:{
        message:function(){
            console.log('i am change')
        }
    }

7.几个不熟悉的内置指令

<!-- 显示的内容不是哈哈,而是data中的message -->
<span v-text="message">哈哈</span>
<!-- v-show的值是一个boolean类型,决定这个标签是不是显示 -->
<span v-show="true">我出现了</span>
<!-- 双向绑定 -->
<input v-model="message">
<!-- 只会加载一次,之后message变化,这个span中的内容都不会再变 -->
<span v-once>{{message}}</span>

8.通过provide()和injecte可以实现子孙组件传值。

//这两个属性都是与data同级别的
inject:['myGlobal']//写在孙子组件
provide(){
    return {
      myGlobal:this
    }
  }//写在爷组件

vue生态

1.为什么要使用vuex?

vue的单向数据流问题

//插入img

当有多个组件共用某些属性的时候,这些属性通常是放在这些组件共同的父组件上,然后通过组件之间层层传递来拿到想要的值,或者通过provide对象和inject对象来传递数据。但这样的方法仅仅适用于小型的应用开发项目。对于复杂的状态管理

2.vuex的属性有什么,如何在vue中使用vuex?

在其他组件中共享main.js中的vuex的数据

//main.js
import Vue from 'vue'
import Vuex from 'vuex'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from './router'
Vue.use(VueRouter)
Vue.use(Vuex)
Vue.config.productionTip = false

const store = new Vuex.Store({
  state:{
    count:115,
    major:'信安',
    school:'天津理工大学'
  },
  mutations:{
    inc(state){
      state.count++
    }
  },
  actions:{
    addTwo({state}){
      state.count+=2
    }
  },
  //getters相当于计算属性computed
  getters:{
    major(state){
      return state.school + "-" +state.major;
      }
    }
})

new Vue({
  store,
  router,
  render: h => h(App),
}).$mount('#app') 

//APP.vue
<template>
  <div id="app">
    <div>{{count}}</div>
    <div>
      <button @click="$store.commit('inc')">mutations</button>
    </div>
    <div>
      <button @click="$store.dispatch('addTwo')">actions</button>
    </div>
    <div>
      {{$store.getters.major}}
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
  components:{
  },
  provide:{
  },
  data(){
    return {
      componentName:'App.vue'
    }
  },
  computed:{
    count(){
      return this.$store.state.count
    }
  },
}
</script>

3.vuex核心概念和底层实现原理

State:提供一个响应式的数据

Getters:借助vue的computed属性来实现缓存

Mutations:更改state方法

Actions:触发mutations方法

Module:Vue.set动态添加state到响应式数据

建议:对每一个组件开启一个命名空间;模块之间的嵌套不要太深

4.vue Router的使用场景

多页面应用访问不同的url就会重新加载页面,单页面应用就不会出现这个问题,所以用户体验比较好。

他的缺点是不利于搜索引擎优化(用服务端渲染解决)而且首屏渲染时间长(用预渲染解决)

5.vue Router解决的问题

  1. vur Router的作用就是监听不同url的变化,并在变化前后执行相应的逻辑操作
  2. 不同的url对应不同的组件
  3. 提供多种方式改变url的API(url的改变不能导致浏览器的刷新)

6.路由有两种模式:Hash和History模式

Hash模式不支持锚点

History模式需要后端配合,IE9不兼容(解决方案是当路由变化的时候强制刷新)

antd-vue-pro实战总结

如何实现按需加载antd的组件

//babel.config.js
module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
  // 按需引入antd
  plugins: [
        [
         "import",
          { libraryName: "ant-design-vue", libraryDirectory: "es", style: true }
        ]
      ]
};
//vue.config.js(间接配置webpack)
module.exports={
    css:{
        loaderOptions:{
            less:{
                javascriptEnabled:true
            }
        }
    }
}
//main.js
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import {Button,Input} from "ant-design-vue"//直接这样引入就行,可以一次引入多个组件。同时引入这些组件的css/less文件
Vue.config.productionTip = false;
Vue.use(Button)//使用
Vue.use(Input)//使用
new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount("#app");

vue的目录结构中大的组件(比如两个不同的页面)就放在views文件夹下。小的组件比如头部或者侧边组件就放在components文件夹下。