Vue快速简单入门

vue基础

1.vue单文件方式及启动

单文件就是以.vue结尾的文件。最终通过webpack也会编译成*.js在浏览器运行
*内容:++
-1:template中只能有一个根节点
-2:script中按照export default{配置}来写
-3:style中 可以设置scope属性,让其只在template中生效

index.html:相当于坑,之后vue编译好的代码往里面插入
main.js :
//引入vue  
import Vue from ‘vue’;
import App from './app.vue';
//创建一个VUe实例,一般一个项目,大多都是一个vue实例来完成显示的  
new Vue({
    //el:'#app',//目的地
    //render:'dom结构' 渲染的内容   
    el:'#app',
    render:function(creater){
        return creater(App);//App包含template、scirpt、style,最终生成Dom结构 
    }
)

*单文件启动
webpack找人来理解你的单文件代码
-vue-loader,vue-template-compiler,代码中依赖vue

2.项目目录的解读

src:存放可以看的懂的源代码,具备一定的功能划分,Mvc
dist:存放真实上线的代码(减少请求,混淆代码),机器能看懂
webpack.config.js 打包生成dist下的代码
package.json 文件 包信息描述

3.vue介绍

核心概念:组件化 双向数据流(基于Es5中的defineProperty来实现的)IE9才实现
组件:组合起来的一个部件(头部,底部,中部)
细分代码
+头部:页面,样式,动态效果
+代码:template style script

4.vue中常用的v-指令演示

v-text:
v-html:
v-if:
v-show:
v-moudel

5.子组件通信

*通过new VUe()这样的一个对象,来 o n ( ′ 事 件 名 ′ , f n ( p r o p 1 , p r o 2 ) ) ∗ 另 一 个 组 件 引 入 同 一 个 v u e b u s , 来 on('事件名',fn(prop1,pro2)) *另一个组件引入同一个vuebus,来 on(,fn(prop1,pro2))vuebus,emit(‘史建民’,prop1,pro2)

6.过滤器

*content |过滤器,vue中没有提供相关的内置过滤器,可以自定义过滤器
*组件内的过滤器+全局过滤器
-组件内过滤器 + 全局过滤器
+多个key就是不同过滤器名,多个value就是与key对应的过滤方式函数体
-vue。filter(名,fn)
全局:范围大,如果出现同名时,权力小
组件内:如果出现同名时,权力大,范围小
+显示:{{text| myFilter}}
+filters:{
myFilter:function(value){
return value.split(’’).reverse().join(’’)
}
},

7.获取dom元素

*在指定的元素上,添加ref=“名称A”
*在获取的地方加入this. r e f s . 名 称 A − 如 果 r e f 放 在 了 原 生 D O M 元 素 上 , 获 取 的 数 据 就 是 原 生 D O M 对 象 − 如 果 r e f 放 在 了 组 件 对 象 上 , 获 取 的 就 是 组 件 对 象 + 1 : 获 取 到 D O M 对 象 , 通 过 t h i s . refs.名称A -如果ref放在了原生DOM元素上,获取的数据就是原生DOM对象 -如果ref放在了组件对象上,获取的就是组件对象 +1:获取到DOM对象,通过this. refs.ArefDOMDOMref+1DOMthis.refs.sub.$el,进行操作
-对应的事件
-created 完成了数据的初始化,此时还未生成DOM,无法操作DOM
+mounted 将数据已经装载到了DOM之上,可以操作DOM

8.vue-router

*前端路由,核心就是锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据
*ui-router :锚点值改变,如何获取模板?ajax
*vue中,模板数据不是通过ajax请求来,而是调用函数来获取到模板内容
*核心:锚点值改变
*以后看到vue开头,就知道必须vue.use
*vue的核心插件:
-vue-router路由
-vuex管理全局共享数据
*使用方式
-下载: vue-router官网找
2.在main.js中引入:import VueRouter from ‘vue-router’;
3.安装插件 vue.use(VueRouter)
4.创建路由对象并配置路由规则
+let router new VueRouter({router:[{path:’/home’,component:Home}] });
5将其路由对象传递给vue的实例,option中
+ options中加入router:router
6.在app.vue中留坑

9.命名路由

*需求: 通过a标签,做页面数据的跳转
*使用router-link标签
- 1:去哪里 去北京
- 2: 去哪里 去北京
+更利于维护,如果修改了path,只修改路由配置中的path,该a标签会根据修改后的值生成href属性

10.参数router-link

*在vue-router中,有两大对象被挂载到了实例this
* r o u t e ( 只 读 , 具 备 信 息 的 对 象 ) 、 route(只读,具备信息的对象)、 route()router(具备功能函数)
*查询字符串
-1:去哪里 xxxx
-2: 导航(查询字符串path不用改){name:‘detail’,path:’/detail’,组件}
-3:去了干吗,获取路由参数(要注意时query还是parms和对应id名)
+ this. r o u t e . q u e r y . i d ∗ p a t h 方 式 − 1 : 去 哪 里 < r o u t e r − l i n k : t o = " n a m e : ′ d e a t i l ′ , p a r a m s : n a m e : 1 " > x x x x < / r o u t e r − l i n k > − 2 : 导 航 ( p a t h 方 式 需 要 在 路 由 规 则 上 加 上 / : x x x ) n a m e : ′ d e t a i l ′ , p a t h : ′ / : n a m e ′ , 组 件 − 3 : 去 了 干 吗 , 获 取 路 由 参 数 ( 要 注 意 时 q u e r y 还 是 p a r m s 和 对 应 n a m e 名 ) + t h i s . route.query.id *path方式 -1:去哪里 <router-link :to="{name:'deatil',params:{name:1}}">xxxx</router-link> -2: 导航(path方式需要在路由规则上加上/:xxx){name:'detail',path:'/:name',组件} -3:去了干吗,获取路由参数(要注意时query还是parms和对应name名) + this. route.query.idpath1<routerlink:to="name:deatil,params:name:1">xxxx</routerlink>2:path/:xxxname:detail,path:/:name,3queryparmsname+this.route.params.name

11.404
-1: {path:'*',component:'/Notfindvue'    
12.多视图

一次行为=一个坑+一个路由+一个组件
一次性为=多个坑+一个路由+多个组件
components 多视图是一个对象,对象内多个key和value
-key对应视图的name属性
-value就是要显示的组件对象
-1:


main.js:
routs:[
{path:’/’,components:{//components一定要加s因为有多个坑
header:headervue,//header为router-view 中的name
default:footervue,//default默认为没有那个name的router-view
footer:footervue
}}
]

1.Fetch请求

js部分

new Vue({
    el:'#vue-app',
    data(){
        return{
            todos:[],
            todo:{
                title:'',
                completed:false
            }
        };
    },
    mounted(){//mounted的作用:在项目渲染之前加载的函数
        //fetch api请求接口
        fetch("https://jsonplaceholder.typicode.com/todos")

        .then(res=>{
            return res.json();//固定写法
        })
        .then(todos=>{
            this.todos=todos;//得到这个接口数据后,赋值给vue的数据属性todo s
        })
    },
    methods:{
        // fetch实现post请求
        onSubmit(){
            fetch('https://jsonplaceholder.typicode.com/todos',{
                method:'POST',//实现其他请求更改名字即可
                body:JSON.stringify(this.todo),
                headers:{
                    'Content-type':'application/json'
                }
            })
            .then(res=>{
                return res.json();
            })
            .then(todo=>{
                this.todos.unshift(todo);
            });
        }
    }
});   

html部分

<h1>Fetch请求</h1>
    <div id="vue-app">
        <!--post请求 -->
        <form @submit="onSubmit">
            <input type="text" v-model="todo.title"/>
            <input type="checkbox" v-model="todo.completed"/>
            <input type="submit" value="提交"/>
        </form>
        <ul>
            <li v-for="todo in todos">
                <h1>{{todo.title}}</h1>
                <p v-if="todo.completed">{{todo.completed}}</p>
            </li>
        </ul>  
    </div>   

2.Axios请求

js部分

new Vue({
    el:'#vue-app',
    data(){
        return{
            todos:[],
            todo:{
                title:'',
                completed:false
            }
        };
    },
    mounted(){  //mounted的作用:在项目渲染之前加载的函数
        //axios get请求接口
        axios.get('https://jsonplaceholder.typicode.com/todos')//.../todos1后面加的数字代表ID
        .then(res=>{
            this.todos=res.data ;
        })
    },
    methods:{
        onSubmit(){
            //axios实现post请求 
            axios  
            .post('https://jsonplaceholder.typicode.com/todos',
            this.todo)
            .then(res=>{
                this.todos.unshift(res.data);
            })
        }
    }
});   

html部分

 <h1>Axios请求</h1>
    <div id="vue-app">
        <!--post请求 -->
        <form @submit="onSubmit">
            <input type="text" v-model="todo.title"/>
            <input type="checkbox" v-model="todo.completed"/>
            <input type="submit" value="提交"/>
        </form>
        <ul>
            <li v-for="todo in todos">
                <h1>{{todo.title}}</h1>
                <p v-if="todo.completed">{{todo.completed}}</p>

            </li>
        </ul>  
    </div>  

3.vue安装脚手架教程

一、脚手架需要的环境
1.Node.js 运行环境
安装步骤:在官网上下载👉https://nodejs.org/zh-cn/或者在电脑应用市场上下载
2.npm(node package manage)依赖包 (node.js安装时自带的依赖包);
3.测试是否安装成功:
在cmd中输入 node -v 看是否有版本号,接着输入 npm -v ,看是否有版本号。
二、安装脚手架
1.打开cmd窗口输入:npm install -g @vue/cli
2.测试脚手架是否安装成功:vue --version
三、安装淘宝镜像
1.打开cmd窗口输入:npm install -g cnpm --registry=https://registry.npm.taobao.org
2.测试是否安装成功:cnpm --version
四、安装webpack
webpack是当前前端最热门的前端资源模块化管理和打包工具。
1.打开cmd输入:npm install webpack -g(-代表全局安装)
2.输入webpack -v是否安装成功。

4.配置文件属性的使用

1.webpack属性配置

    moudule.exports={
        entry:{      //main是默认入口,也可以是多入口
            main:'./src/main.js'
        },  
        //出口  
        output:{
            filename:'.build.js',   //指定js文件  
            path:path.join(_dirname,'..','dist',)   //最好是绝对路径
            //代表当前目录的上一级的dist
            
        },
        module:{
            //一样的功能rules: webpack2.x之后新加的
            loaders:[       require('./a.css||./a.js')
                {
                    test:/\.css$\/,
                    loader:'style-loader!css-loader',   //多个loader用!分割
                    //顺序是反过来的2!1
                    
                },
                {
                    test:/\.(jpg|svg)$/,
                    loader:'url-loader?limit=4096&name=[name].[ext]',   //多个参数用&分割
                    //顺序是反过来的2!1
                    //[name].[ext] 内置提供的,因为本身是先读这个文件
                    option:{
                        limit:4096,
                        name:'[name].[ext]'
                    }
                }
            ]
        },
        plugins:[
            //插件的执行顺序是依次执行的
            new htmlWebpackPlugin({
                template:'./src/index.html' 
            })
            //将src下的template属性描述的文件根据当前配置的output.path,
            //将文件移动到该目录
        ]
    }


## 6.vue阶段总结
### 问题:  
#### 1.脚手架安装   
一、脚手架需要的环境  
1.Node.js 运行环境   
安装步骤:在官网上下载👉https://nodejs.org/zh-cn/或者在电脑应用市场上下载  
2.npm(node package manage)依赖包 (node.js安装时自带的依赖包);
3.测试是否安装成功:
在cmd中输入 node	-v  看是否有版本号,接着输入 npm -v  ,看是否有版本号。
二、安装脚手架  
1.打开cmd窗口输入:npm install -g @vue/cli  
2.测试脚手架是否安装成功:vue --version  
三、安装淘宝镜像 
1.打开cmd窗口输入:npm install -g cnpm --registry=https://registry.npm.taobao.org  
2.测试是否安装成功:cnpm --version   
四、安装webpack  
webpack是当前前端最热门的前端资源模块化管理和打包工具。  
1.打开cmd输入:npm install webpack -g(-代表全局安装)
2.输入webpack -v是否安装成功。
#### 2.注册组件   
一·注册全局组件   
进入main·js,导包:import idefinition from "xxxx/xxx.vue" 
创建组件:Vue·component(id,idefinition)  
在任何组件使用时直接在html中加入<id/>   
二·注册局部组件    
1.单独声明组件。用js 对象注册组件   

var ComponentA = {
template:<p>注册一个组件aaaa</p>
}

var ComponentB = {emplate:<p>注册一个组件bbb</p> }
var ComponentC = { /* … */ }


new Vue({
el: ‘#app’,
components: {
‘com-A’: ComponentA,
‘com-B’: ComponentB
}
})

在挂载的元素中使用组件  
``` 2.直接在实例中components属性中注册:然后在挂载的根元素中使用 在main.js文件导入每个你想使用的组件 import Base from './Base.vue' 在使用的组件的js: export dafault{ components:{ Base } } Html: #### 3.router使用方式 1.安装vue-router 模块 cnpm install vue-router --save 2.在main·js中引用并使用vue-router模块 import VueRouter from 'vue-router' Vue.use(VueRouter) 3.创建路由地址分离routes文件 ``` import default[ {path:'/',components:ShowBlogs}, {path:'/',components:AddBlog}, ] ``` 4.设置路由模块设置mode去掉浏览器地址后面的#号 ``` import Routes from './routes' const router= new VueRouter({ routes:Routes, mode:'history' })

new Vue({
el:’#app’,
render: h=>h(App),
router:router
})

5.在app.vue中设置router-view  
``` 6.设置router-link地址 ``` xxx xx 去北京 ``` 7.router-link * 在vue-router中,有两大对象被挂载到了实例this * $route(只读、具备信息的对象)、$router(具备功能函数) * 查询字符串 - 1:去哪里 `xxx` - 2:导航(查询字符串path不用改) `{ name:'detail' , path:'/detail',组件}` - 3:去了干嘛,获取路由参数(要注意是query还是params和对应id名) + `this.$route.query.id` * path方式 - 1:去哪里 `xxx` - 2:导航(path方式需要在路由规则上加上/:xxx) - `{ name:'detail' , path:'/detail/:name',组件}` - 3:去了干嘛,获取路由参数(要注意是query还是params和对应name名) + `this.$route.params.name`
4.路由器添加点击事件

在路由器中添加点击事件必须加上·native修饰符

5.渲染数据去重

1.存储数据时,添加一个特殊属性值当作标记(最好是布尔类型)
存储时为true ,当获取相同的数据时,修改该属性为false
在渲染时,根据该属性进行的真假进行显示

知识点总结

6.生命周期图示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAq9clkl-1601791735705)(https://note.youdao.com/favicon.ico)]

7.动态参数:

<a v-bind:[attributeName]=“url”>…
如果你的 Vue 实例有一个 data 属性 attributeName,其值为 “href”,那么这个绑定将等价于 v-bind:href

8.修饰符:

修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

10.computed属性和watch属性

1.computed

<div class="test">
   <p>原始的信息{{message}}</p>
   <p>计算后的信息{{ComputedMessage}}</p>
 </div>
js代码
var myVue = new Vue({
   el: ".test",
   data: {
     message:12
   },
   computed:{
     ComputedMessage:function () {
       return this.message+10;
     }
   }
 });
界面会显示 12 和 22
上述的方式是一种缓冲的实现的效果,这种实现的方式依赖于它的缓寸,计算得到的属性只有在相关依赖(message)改变的时候才会重新取值,这就意味着只要message没有发生改变的时候,多次访问ComputedMessage都不会再重新执行计算的这个属性。

2.watch

<div class="test">
  <p>原始的信息{{fullName}}</p>
  <button @click="fu">test</button>
</div> 
js代码  
var myVue = new Vue({
   el: ".test",
   data: {
     firstName:"fur",
     lastName:"bool",
     fullName:"sasas dsdsd dsds"
   },
   computed:{
     fullName:{
       get:function () {
         console.log("get")
         return this.firstName+this.lastName
       },
       set:function(value){
         var names=value.split(" ");
         this.firstName=names[0];
         this.lastName=names[names.length-1];
         console.log("set");
       }
     }
   },
   methods:{
     fu:function () {
       myVue.fullName="sasas dsdsd dsds";
       console.log(myVue.firstName);   //sasas
       console.log(myVue.lastName);  //dsds
     }
   }
 });

首先会输出get;
在点击按钮为fullName赋值的时候首先调用set 再调用get方法。

11.Class和style绑定

操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
1.第一种方法:

v-bind:class="{a:b,c:b}"     a c 代表CSS样式表里相应的样式名       b 代表true(启用此样式)/false(不启用此样式)  

html

    <!--vue-app是根容器-->
    <div id="vue-app">
        <input type="button" v-on:click="a=!a" v-bind:class="{changeColor:a,changeWidth:a}" value="change!">
    </div>

css

.changeColor{
    background: brown;
    color: #ffffff;
}
.changeWidth{
    width: 200px;
}

css

.changeColor{
    background: brown;
    color: #ffffff;
}
.changeWidth{
    width: 200px;
    
}

js

new Vue({
    el:"#vue-app",
    data:{
        a:false
    },
    methods:{},
    computed:{}
});

2.第二种方法

<!--vue-app是根容器-->
    <div id="vue-app">
        <input type="button" v-on:click="a=!a" v-bind:class="change" value="change">
    </div>
//实例化vue对象
new Vue({
    el:"#vue-app",
    data:{
        a:false
    },
    methods:{},
    computed:{
        change:function(){
            return {
                changeColor:this.a,
                changeWidth:this.a
            }
        }
    }
});
11.组件通信

porps/ e m i t 方 式 父 组 件 通 过 p r o p s 的 方 式 向 子 组 件 传 递 数 据 , 而 通 过 emit 方式 父组件通过props 的方式向子组件传递数据,而通过 emitpropsemit子组件可以向父组件通信
1.父组件向子组件传值
通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件
section.vue中的数据 articles:[‘红楼梦’,‘西游记’,‘三国演义’]

// section父组件
<template>
  <div class="section">
    <com-article :articles="articleList"></com-article>
  </div>
</template>

<script>
import comArticle from './test/article.vue'
export default {
  name: 'HelloWorld',
  components: { comArticle },
  data() {
    return {
      articleList: ['红楼梦', '西游记', '三国演义']
    }
  }
}
</script>

// 子组件 article.vue
<template>
  <div>
    <span v-for="(item, index) in articles" :key="index">{{item}}</span>
  </div>
</template>

<script>
export default {
  props: ['articles']
}
</script>
总结:prop只可以从上一级组件传递到下一级组件(父子组件),即所谓的单向数据流。而且prop只读,不可被修改,所有修改都会失效并警告。

2.子组件向父组件传值
// 父组件中

//子组件

12.ajax请求

vue本身不支持ajax请求,需要使用“axios”的第三方插件,axios是基于promise的http请求客户端,用来发送请求,是Vue2.0推荐使用的,同时不再对vue-resource进行更新和维护。也可以使用vue-resource进行跨域请求。
axios的安装和使用
通过npm安装和直接引用其js文件;
基本使用:
a·可以在methods中定义一个方法来调用axios()方法 ;
b·使用axios(【options】)方法,axios(【options】).then(function(respon){}).catch(function(error){}),
在这里.then就是成功后要做的事情,responce就是成功后 返回的对象(数据就在这个对象里),catch就是失败的时候要做的事情,error就是错误后返回的错误信息对象
c.使用axios.get(url[,options])方法;
get传参方式:
1.直接拼接在url后面(不建议);
2.在params的选项传参(options中的一个选项params,是一个对象)
d.使用axios·post(url,data,【options】)方法;
axios.post(url,jsonData,{                                 transformRequest:[                                 function(data){                                         <!-- 这里的data就是前面的jsonData -->                                         在这里进行手动拼接成“键值对”字符串,并返回                                     }                                 ]                             }[options])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值