Vue浅学习笔记

Vue

IDEA:插件 VUE

vue指令

  • v-if
  • v-else
  • v-else-if
        <div id="app">
        <span v-if="type==='A'">A</span>
        <span v-else-if="type==='B'">B</span>
        <span v-else-if="type==='C'">C</span>
        <span v-else>no</span>
        </div>
    
  • v-for
      <li v-for="(item,index) in items">
          {{item.message}}--{{index}}
      </li>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
    <script>
        var vm = new Vue({
            //Model:数据
            el : "#app",
            data : {
                 items : [
                    {message : "fanxu"},
                    {message : "muyu"}
                 ]
            }
        });
    
    </script>
    
  • v-on

七个常用属性

<script>
	var vm = new Vue({
        el:"",
        data:{
            message:"hello vue"
        },
        methods:{//方案必须定义在vue的Method的对象中
            sayHi:function(){
                alert(this.message);
            }
		}
    })    
</script>
  • el
  • data
  • template
  • method
  • render
  • computed
  • watch

v-model双向绑定

 <div id="app">
        <input type="text" value="" v-model="message"/> {{message}}
        <!--<textarea v-model="message" cols="30" rows="30">输入的文本:</textarea><br>-->
        <br><br>
        <input type="radio" name="sex" value="" v-model="param1"><input type="radio" name="sex" value="" v-model="param1"><br>
        选中了:{{param1}}<br><br>

        <select  v-model="param2">
            <option value="" disabled>--请选择--</option>
            <option>音乐</option>
            <option>文学</option>
            <option>工具</option>
            <option>科幻</option>
            <option>名著</option>
        </select><br>
        选择了:{{ param2}}
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            message:"1",
            param1:"",
            param2:""
        }
    });
</script>

用v-model绑定一个data里的值,然后再在其他地方调用这个指
就可以做出一边的值改变,多处位置的文本同时改变的效果

网络通信:Axios

什么是Axios?

Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。

既然是发get、post请求,那为什么不用jQuery.ajax呢?

这是因为使用jQuery会大量的操作DOM,这样会导致前端页面变得迟缓,所以使用了Axios这种轻量级的处理方式。

例子

先导入vue的依赖和axios的依赖

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

style

<style>
    [v-clock]{
        display: none;
    }
</style>

html页面

<!--v-clock可以解决html页面闪烁的问题-->
<div id="app" v-clock>
    {{info.name}} <br>
    {{info.address.street}}<br>
    <a v-bind:href="info.url">{{info.name}}</a>
</div>

javascript

<script>
    var vm = new Vue({
        el: "#app",
        //data return这种写法可以接受axios的返回值,与之前使用data不同。
        data(){
          return{
              //这里要注意,需要调用的属性写在这里就可以,不需要的可以不写,注意一定不要写错字段的名字。否则会接收不到值
              info:{
                  name: null,
                  url: null,
                  page: null,
                  address: {
                      street: null,
                      city: null,
                      country: null
                  }
              }
          }
        },
        //这里写axios方法,mounted是vue的钩子函数
        mounted(){
            axios.get("data.json").then(response=>( this.info=response.data));
        }
    })
</script>

json数据

{
  "name": "百度",
  "url": "http://www.baidu.com",
  "page": 88,
  "isNonProfit": true,
  "address": {
    "street": "鲁谷街道.",
    "city": "北京",
    "country": "中国"
  }
}

计算属性

计算出来的结果,保存在属性中,内存中运行:虚拟Dom
可以把它想象成缓存

computed与methods的区别

  • methods中的方法,在通过vm调用之后,是会重新执行一遍的
  • comupted中的方法,比较类似于缓存,如果方法里的内容没有变化,那么即使通过vm调用了这个方法,也不会重新执行一遍,而是会调用之前执行好的内容。、

所以,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销,前端节省的资源对于并发来说很是重要

什么是计算属性

计算属性的重点突出在 属性 两个字上(属性是名词),首先它是个 属性 其次这个属性有 计算
的能力(计算是动词),这里的 计算 就是个函数;简单点说,它就是一个能够将计算结果缓存起来的
属性(将行为转化成了静态的属性),仅此而己;可以想象为缓存!

html

<div id="app">
    <!--methods通过方法来调-->
    <p>currentTime1:{{currentTime1()}}</p>
    <!--computed通过属性来调-->
    <p>currentTime2:{{currentTime2}}</p>
</div>0

javascript

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            message: "hello world"
        },
        //每次调用的时候都会重新计算
        methods: {
            currentTime1: function(){
                return Date.now();//返回一个时间戳
            }
        },
        //computed计算完这个方法之后,会将值存入内存中,除非方法里的值变了,否则一直不会刷新
        //可以将computed想象成缓存,用于节约系统的开销
        computed: {
            currentTime2: function(){
                return Date.now();//返回一个时间戳
            }
        }
    })
</script>

Vue组件:Vue.Component

<div id="app">
    <l v-for="item in items" v-bind:a="item"></l>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
    Vue.component("l",{
        props:['a'],
        template:"<li>{{a}}</li>"
    });
    var vm = new Vue({
        el:"#app",
        data:{
            items:['java','linux','前端']
        }
    }); 
</script>

首先data中的items里存放了一个数组
然后放到上边已经绑定好的l组件中
l组件需要遍历数组中的多个值
用v-for实现,但是因为是组件显示
所以一般的传值方式传不进去
用v-bind:a="item"绑定参数
然后在Vue.component中的props:[‘a’]放已经绑定好的变量

slot 插槽

类似于模板,可以通过插槽动态的生成一种模板化的dom,多个组件通过slot互相关联


    <div id="app">
        <todo>
            <!--:title=等价于 v-bind:title; slot="todo-title" 与下方的两个component进行了绑定-->
            <todo-title slot="todo-title" :title="title"></todo-title>
            <todo-items slot="todo-items" v-for="(item,index) in todoItems" :item="item"></todo-items>
        </todo>
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
//先定义一个大的模板
    Vue.component("todo",{
        template:'<div>'+
                    '<slot name="todo-title"></slot>'+//通过name属性,和下边定义的component绑定起来
                    '<ul>' +
                        '<slot name="todo-items"></slot>'+
                    '</ul>'+
                '</div>'

    });
//详细的定义了一个标签    
    Vue.component("todo-title",{
//绑定的属性名        
        props:['title'],
        template:'<div>{{title}}</div>'
    });
    Vue.component("todo-items",{
        props:['item'],
        template:'<li>{{item}}  </li>'
    });
    var vm = new Vue({
        el:"#app",
        data: {
            title:"范栩",
            todoItems:['fanxu','muyu','yu']
        }
    });
</script>

自定义事件分发


    <div id="app">
        <todo>
            <todo-title slot="todo-title" :title="title"></todo-title>
            <todo-items slot="todo-items" v-for="(item,index) in todoItems"
                        :item="item" :index="index" @remove="removeItems(index)" :key="index"></todo-items>

        </todo>
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script>
    Vue.component("todo",{
        template:'<div>'+
                    '<slot name="todo-title"></slot>'+
                    '<ul>' +
                        '<slot name="todo-items"></slot>'+
                    '</ul>'+
                '</div>'

    });
    Vue.component("todo-title",{
        props:['title'],
        template:'<div>{{title}}</div>'
    });
    Vue.component("todo-items",{
        props:['item','index'],
        template:'<li>{{index}}--{{item}} <button @click="remove">删除</button></li>',
        methods:{
            remove:function(index){
                this.$emit("remove",index)
            }
        }

    });
    var vm = new Vue({
        el:"#app",
        data: {
            title:"范栩",
            todoItems:['fanxu','muyu','yu']
        },
        methods:{
            removeItems:function(index){
                this.todoItems.splice(index,1);
            }
        }

    });

主要知识点:this.$emit(),这个方法可以调用父级的方法,然后,通过前端自定义方法调用vm中的methods,达到双向绑定的效果
@等价于v-on:

创建工程

# 进入工程目录
cd hello-vue
# 安装 vue-router
npm install vue-router --save-dev
# 安装element-ui -S
npm i element-ui -S
# 安装依赖
npm install
# 安装SASS加载器
cnpm install sass-loader node-sass --save-dev
# 启动测试
npm run dev

npm命令解释

  • npm install moduleName :安装模块到项目目录下

  • npm install -g moduleName:-g的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看npm config prefix的位置

  • npm install -save moduleName:–save的意思是将模块安装到项目目录下,并在package文件的dependencies节点写入依赖,-S为该命令的缩写

  • npm intall -save-dev modulename:–save-dev的意思是将该模块安装到项目目录下,并在package文件的devDependencies节点写入依赖,-D为该命令的缩写。

路由嵌套

export default new Router({
	routes:[
    {
		path:'/main',
		component:Main
    },{
		path:'/login'
		component:Login,
		children:[
			{path:'/user/profile',component:UserProfile},
			{path:'/user/list',component:UserList}
		]
	}
	]
})l

使用chirldren就可以进行路由的嵌套

传参和重定向

<!--//传参-->
<router-link :to="{name:'/user/profile',params:{id:1}}"></router-link>
<!--//接参-->
routes:[
{path:'/user/profile:id',component:UserProfile}
]
<!--//html取值-->
{{$route.params.id}}
<!--//!!注意,所有元素不能直接暴露在根节点中,需要有标签包裹-->

<!--props解耦-->
routes:[
{path:'/user/profile:id',component:UserProfile,props:true}
]
//props html
{{id}}
<!--重定向-->
{
	path:'/goHome',
	redirect:'/main'
}

钩子和404页面

路由模式有两种

  • hash:路径带#符号,如http://localhost:/#/login
  • history:路径不带#符号,如http://localhost/login
export default new Router({
	mode:'history',
	routes:[]
})

404

先创建了一个NotFound.vue 并且import了这个NotFound

{
	path:'*',
	component:NootFound
}

钩子

过滤器


beforeRouteEnter:(to,from,next)=>{
	console.log("进入路由之前");
    next();
},
beforeRouteLeave:(to,from,next)=>{
	console.log("进入路由之后");
    next();
}

参数说明:

  • to:路由将要跳转的路径信息
  • from:路径跳转前的路径信息
  • next:路由的控制参数
    • next()跳入下一个页面
    • next(‘path’)改变路由的跳转方向,使其跳到另一个路由
    • next(false)返回原来的页面
    • next((vm=>{}))仅在beforeRouterEnter中可用,vm是组件案例

cnpm有可能安装失败,尽量使用npm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值