vue学习-从搭建开始(前端小白)

333 阅读5分钟

vue-cli2升级vue-cli3(只是vue脚手架的3版本不是vue3.0)

vue-cli2安装步骤

npm install--global vue-cli \ cnpm install--global vue-cli

使用步骤

vue init webpack-simple vuedemo1 (推荐) \ vue init webpack vuedemo2
cd vuedemo1 \ cd vuedemo2
cnpm install \ npm install
npm run dev

vue-cli3安装步骤

安装步骤

npm uninstall vue-cli -g \ yarn global remove vue-cli   (用于卸载原来的vue-cli2)

npm install -g @vue/cli  \ yarn global add @vue/cli   (安装vue-cli3)

vue -v  (查看vue-cli版本)

创建步骤

vue create vuedemo
运行:npm run server \ yarn start 
编译:npm run build \ yarn

vue-cli3图形化界面创建项目

vue ui

跳转到对应的浏览器路径之后自行创建

项目各个文件详解

-src
    -assets  //放置全局公用的样式、图片、字体
    -components //公共组件部分
    -pages //页面级组件
    -App.vue  //入口文件    
    -main.js  //全局样式或者js导入的文件
-.babelrc   //babel的配置文件
-.editorconfig  //编辑器的配置文件
-.gitignore   //git的配置文件
-index.html  //HTML的入口文件,移动端视口需要更改
-package.json   //创建项目的开发环境的配置和生产环境的配置
-webpack.config.js  //webpack 的配置文件 可以自行更改端口等等

vue文件详解

<template>
    <div id="app">
        <p> {{msg}}</p>
        <br>
        <p> {{obj.name}}</p>
         <br>
        <ul>
            <li v-for="item in list">
                {{item}}
            </li>
        </ul>
         <br> //循环 
         <ul>
            <li v-for="item in list1">
                {{item.title}} 
            </li>
        </ul>
        <br>
        <div :class={red:flag}>//绑定class
            flag为true我为红色,否则我为默认颜色
        </div>
    </div>
</template>

<script>
    export default{
        el: '#app', //获取所要使用的区域****
        name:'app', //用于给组件配置一个名称(可写可不写)
        data(){/*业务逻辑里面定义的数据*/
            return{
                flag:'true',
                msg:'你好vue',
                boj:{
                    name:'张三'
                },
                list:['1','2','3'],
                list1:[
                    {'title':'111'},
                    {'title':'222'},
                    {'title':'333'},
                    {'title':'444'},
                ]
            }
        },
        methods:{/*写js方法的地方*/
            submitHandle(){
                console.log("提交了")
            }
        },
        router, //传入组件
        components: {}, //方法表示一个具体的操作,主要书写业务逻辑
        computed: {}, //属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;
        watch: {}, //一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computed和methods的结合体
      // ----------------------------------------------------------------------------------------------------------
         beforCreate() {
        //生命周期函数之一,表示实例完全创造之前会执行它
         },
        create() {
        //这是第二个生命周期函数,在create中data和methods都已经被初始化好了
        //如果要使用data和methods中的数据和方法,最早也只能在create中调用
        },
         beforeMount() {
        //这是第三个生命周期,表示模板已经在内存中编译完成了,但是尚未把模板渲染到页面中
        //在beforMount中执行的时候,页面中的元素还没有被替换过来,只是尚未替换的字符串,例如:{{msg}}
         },
         mounted() {
        //这是第四个生命周期,表示,内存中的模板已经真是的挂在到页面中,用户已经可以看到渲染好的页面了
        //例如在beforeMount中看到的是{{msg}},在mounted中可以是:你好!!

        // 注意:mounted是实例创建期间的最后一个生命周期函数,当执行完mounted就表明实例已经完全被创建好了
        // 此时,若没有其他操作的话,这个实例,就静静的躺在内存中一动不动
        },
      // 以上四个生命周期函数指的是vue组件实例的四个生命周期函数
      // ----------------------------------------------------------------------------------------------------------------
      // ----------------------------------------------------------------------------------------------------------------
      // 接下来的是运行 中的两个事件:只有当data数据发生改变时才能出发以下两个事件
        beforeUpdate() {
        //当执行beforUpdata的时候,页面中显示的数据是改变之前的数据,此时页面中的数据是新的,但是它尚未和页面同步,就是前一步操作
         },
        updated() {
        //updated执行的时候页面和数据已经同步,都是最新的数据
         },
      // ----------------------------------------------------------------------------------------------------------------
      // ----------------------------------------------------------------------------------------------------------------
        beforeDsetory() {
        //当执行beforeDsetory钩子函数的时候,vue实例就已经从运行阶段进入到了销毁及前端
        //当执行beforeDsetory的时候,实例身上所有的data和所有methods,以及过滤器,指令……都处于可用状态
        //此时,还没有真正执行销毁的过程
      },
         dsetoryed() {
        //当执行dsetoryed函数的时候,组件已经被完全销毁了,此时,组件中所有的数据,方法,指令,过滤器……都已经不可用了
      }
    }
</script>
<style scoped="scoped">
.red{
    color:red
}
</style>

vue属性

  • v-bind --> : //绑定属性
  • v-on --> @ //绑定方法
  • v-html //绑定html标签
  • v-text //绑定文本数据

vue请求数据

1、vue-resource(官方的请求数据的插件) 首先安装vue-resouce

yarn add vue-resource \ npm install vue-resource

使用方法:在main.js中引入

import VueResource from 'vue-resource'

Vue.use(VueResource)

在对应的组件中请求数据:

methods:{
    getData(){
    let api = 'https://...'
        this.$http.get(api).then(res=>{
            conse.log('成功')
        }),,error=>{
             conse.log('失败')
        }
    }
}

2、axios(第三方插件) 安装:

yarn add axios \npm install axios --save

在哪里用哪里引用

import Axios from 'axios'

methods:{
    getData(){
    let api = 'https://...'
        Axios.get(api).then(res=>{
              conse.log('成功')
        }).catch(error=>{
            conse.log('失败')
        })
    }
}

3、fetch的使用方法和axios相同

组件间的传值

父组件传值子组件

  • 父组件调用子组件的时候,绑定动态属性如:
<Home :title="title"></Home>
  • 在子组件中通过props接收父组件传过来的数据
props:{
    'title'
}
  • 然后在子组件中直接调用

父组件主动获取子组件中的数据和方法

  • 第一步,调用子组件的时候定义一个ref
<Header ref="header"></Header>
  • 第二步在父组件中调用ref
this.$refs.header

子组件主动获取父组件中的数据和方法

-直接通过

this.$parent.(父组件的数据或者方法)

非父子组件传值

通过bus.js来传值,在外部自定义一个位置创建一个bus.js,内容为:

import Vue from 'vue';

var Bus = new Vue();

export default VueEvent;

在需要的组件中引入:首先需要暴露数据的组件代码

<template>
    <div>
    //传值组件
        <button @click="emitNews">
            给别人传值
        </button>
    </div>
</template>
<script>
import Bus from './Bus'

export default {
    data:{
        return{
            msg:'123'
        }
    },
    methods:{
        emitNews(){
            Bus.$emit('to-news',this.msg) //第一个参数是名字,随便取,第二个为要传出去的数据
        }
    }
}
</script>


<template>
    <div>
    //接收组件
    </div>
</template>
<script>
import Bus from './Bus'

export default {
    mounted:{
    //$emit为开放数据,$on为接收数据
         Bus.$on('to-news',data=>{
             console.log(data)
         })   
    }
}
</script>

VUE路由

vue-router安装步骤:

yarn add vue-router \ npm install vue-router --save

然后在main.js中引入:

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter)

配置路由:

  • 创建组件,然后引入组件
  • 定义路由
const routes=[
    {path:'/foo',component:Foo},
    {path:'/bar',component:Bar}
]
  • 实例化VueRouter
const router = new VueRouter({
    routes
})
  • 挂载,在根组件中挂载路由
new Vue({
    el:'#app',
    router
})

动态路由

const routes=[
    {path:'/foo',component:Foo},
    {path:'/bar/:aid',component:Bar} //aid就是动态跳转的路径参数
]

此时就可以在Bar组件中获取动态路由的值

mounted(){
    console.log(this.$route.params) //获取动态路由传值
}

通过js跳转路由(编程式导航)

<template>
    <div>
        <button @click="goNews">通过js跳转</button>
    </div>
</template>
<script>
export default {
    methods:{
           goNews(){
               this.$router.push({
                   path:'/news'
               })
           } 
    }
}
</script>

通过history和hash模式跳转

//在实例化路由的时候更改模式
const router = new VueRouter({
    mode:'history',//默认为hash模式
    routes
})

路由嵌套

const routes=[
    {path:'/foo',component:Foo},
    {
        path:'/bar',
        component:Bar,
        children:[
            path:'/barson',
            component:BarSon,
        ]
    }
]

路由模块化: 在src下新建一个router文件,然后在里面建文件:router.js

//router.js中的代码例子
import Vue from "vue";
import Router from "vue-router";
import Home from "@/page/home/Home";
import Personal from "@/page/personal/Personal";
import Container from "@/page/container/Container";

Vue.use(Router);

export default new Router({
    routes: [
        {
            path: "/",
            name: "home",
            component: Home
        },
        {
            path: "/personal",
            name: "personal",
            component: Personal
        },
        {
            path: "/container:id",
            name: "container",
            component: Container
        }
    ]
});



//main.js代码例子
import Vue from 'vue'
import App from './App'
import router from './router'

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,//导入路由
  components: { App },
  template: '<App/>'
})

VueX讲解

用于解决不同组件间的数据共享(数据持久化) --->非父子、兄弟组件 1、首先安装vuex

cnpm install vuex --save \ yarn add vuex

2、在src目录下新建一个store文件夹,并在里面建立store.js (vuex仓库)

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use.(Vuex);
/*
*state在vuex中表示存储数据
*/
var state ={
    count:1
}

/*
*mutations里面放的是方法,方法主要用于改变state中的数据
*/
var mutations ={
    inCount(){
        ++state.count;//这样count会自增
    }
}

/*
*getters类似于计算属性(改变state数据的时候,会触发getters的方法,获取新的值)
*/
var getters ={
    computedCount:(state)=>{
        return state.count*2
    }
}
/*
*action类似于mutations,不同在于:action提交的是mutations,而不是直接变更状态,action可以包含任意的异步操作
*/
var action ={
   incMutations(context){//可以调用context.commit 提交一个 mutations
       context.commit('inCount')//执行mutations中的inCount方法,进而改变count
   }
}
//vuex
const store = new Vuex.Store({
    state,
    mutations,
    getters,
    action
})
export default store;//将vuex暴露出去 

在需要使用到的组件中引入

<template>
<div>
/*
*第一个为vuex仓库中的数据,经过mutations中的方法每次加一
*第二个为vuex仓库中的getters的计算属性,state中的数据改变就会直接调用getters的方法,不需要想mutations中的方法一样要注册(基本没用)
*
*/
    使用vuex中的数据 -- {{this.$store.state.count}} -- {{this.$store.getters.computedCount}} 
    <br />
    //通过mutations中的方法改变
    <button @click="inCount">改变vuex中state的数据</button>
</div>
</template>
<script>
//引入
import store from './store/store.js'//假设路径就是这样
//注册
export default{
    data(){},
    store,//注册了,和注册路由一个样
    methods:{
        inCount(){
            //this.$store.commit('inCount');//获取store中的mutations的方法
            this.$store.dispatch('incMutations');//通过action里的方法去调用mutation中的方法
        }
    }
    ...
}
</script>