父组件向子组件传值

  1. 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据

<script>    // 创建 Vue 实例,得到 ViewModel    var vm = new Vue({      el: '#app',      data: {       msg: '这是父组件中的消息'     },     components: {       son: {         template: '<h1>这是子组件 --- {{finfo}}</h1>',         props: ['finfo']       }     }   }); </script>
  1. 使用v-bind或简化指令,将数据传递到子组件中:

<div id="app">    <son :finfo="msg"></son>  </div>

子组件向父组件传值

  1. 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;

  2. 父组件将方法的引用传递给子组件,其中,getMsg是父组件中methods中定义的方法名称,func是子组件调用传递过来方法时候的方法名称

<son @func="getMsg"></son>
  1. 子组件内部通过this.$emit('方法名', 要传递的数据)方式,来调用父组件中的方法,同时把数据传递给父组件使用

<div id="app">    <!-- 引用父组件 -->    <son @func="getMsg"></son>​   <!-- 组件模板定义 -->   <script type="x-template" id="son">     <div>       <input type="button" value="向父组件传值" @click="sendMsg" />     </div>   </script> </div>​ <script>   // 子组件的定义方式   Vue.component('son', {     template: '#son', // 组件模板Id     methods: {       sendMsg() { // 按钮的点击事件         this.$emit('func', 'OK'); // 调用父组件传递过来的方法,同时把数据传递出去       }     }   });​   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {},     methods: {       getMsg(val){ // 子组件中,通过 this.$emit() 实际调用的方法,在此进行定义         alert(val);       }     }   }); </script>

组件中data和props的区别

评论列表案例

目标:主要练习父子组件之间传值

使用 this.$refs 来获取元素和组件

  <div id="app">    <div>      <input type="button" value="获取元素内容" @click="getElement" />      <!-- 使用 ref 获取元素 -->      <h1 ref="myh1">这是一个大大的H1</h1>​     <hr>     <!-- 使用 ref 获取子组件 -->     <my-com ref="mycom"></my-com>   </div> </div>​ <script>   Vue.component('my-com', {     template: '<h5>这是一个子组件</h5>',     data() {       return {         name: '子组件'       }     }   });​   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {},     methods: {       getElement() {         // 通过 this.$refs 来获取元素         console.log(this.$refs.myh1.innerText);         // 通过 this.$refs 来获取组件         console.log(this.$refs.mycom.name);       }     }   }); </script>

什么是路由

  1. 后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;

  2. 前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;

  3. 在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);

在 vue 中使用 vue-router

  1. 导入 vue-router 组件类库:

<!-- 1. 导入 vue-router 组件类库 -->  <script src="./lib/vue-router-2.7.0.js"></script>
  1. 使用 router-link 组件来导航

<!-- 2. 使用 router-link 组件来导航 --><router-link to="/login">登录</router-link><router-link to="/register">注册</router-link>
  1. 使用 router-view 组件来显示匹配到的组件

<!-- 3. 使用 router-view 组件来显示匹配到的组件 --><router-view></router-view>
  1. 创建使用Vue.extend创建组件

    // 4.1 使用 Vue.extend 来创建登录组件    var login = Vue.extend({      template: '<h1>登录组件</h1>'    });​   // 4.2 使用 Vue.extend 来创建注册组件   var register = Vue.extend({     template: '<h1>注册组件</h1>'   });
  1. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则

// 5. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则    var router = new VueRouter({      routes: [        { path: '/login', component: login },        { path: '/register', component: register }     ]   });
  1. 使用 router 属性来使用路由规则

// 6. 创建 Vue 实例,得到 ViewModel    var vm = new Vue({      el: '#app',      router: router // 使用 router 属性来使用路由规则    });

使用tag属性指定router-link渲染的标签类型

设置路由重定向

设置路由高亮

设置路由切换动效

在路由规则中定义参数

  1. 在规则中定义参数:

{ path: '/register/:id', component: register }
  1. 通过 this.$route.params来获取路由中的参数:

var register = Vue.extend({      template: '<h1>注册组件 --- {{this.$route.params.id}}</h1>'    });

使用 children 属性实现路由嵌套

  <div id="app">    <router-link to="/account">Account</router-link>​    <router-view></router-view> </div>​ <script>   // 父路由中的组件   const account = Vue.extend({     template: `<div>       这是account组件       <router-link to="/account/login">login</router-link> |        <router-link to="/account/register">register</router-link>       <router-view></router-view>     </div>`   });​   // 子路由中的 login 组件   const login = Vue.extend({     template: '<div>登录组件</div>'   });​   // 子路由中的 register 组件   const register = Vue.extend({     template: '<div>注册组件</div>'   });​   // 路由实例   var router = new VueRouter({     routes: [       { path: '/', redirect: '/account/login' }, // 使用 redirect 实现路由重定向       {         path: '/account',         component: account,         children: [ // 通过 children 数组属性,来实现路由的嵌套           { path: 'login', component: login }, // 注意,子路由的开头位置,不要加 / 路径符           { path: 'register', component: register }         ]       }     ]   });​   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {},     methods: {},     components: {       account     },     router: router   }); </script>

命名视图实现经典布局

  1. 标签代码结构:

<div id="app">    <router-view></router-view>    <div class="content">      <router-view name="a"></router-view>      <router-view name="b"></router-view>   </div> </div>
  1. JS代码:

<script>    var header = Vue.component('header', {      template: '<div class="header">header</div>'    });​   var sidebar = Vue.component('sidebar', {     template: '<div class="sidebar">sidebar</div>'   });​   var mainbox = Vue.component('mainbox', {     template: '<div class="mainbox">mainbox</div>'   });​   // 创建路由对象   var router = new VueRouter({     routes: [       {         path: '/', components: {           default: header,           a: sidebar,           b: mainbox         }       }     ]   });​   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {},     methods: {},     router   }); </script>
  1. CSS 样式:

  <style>    .header {      border: 1px solid red;    }​   .content{     display: flex;   }   .sidebar {     flex: 2;     border: 1px solid green;     height: 500px;   }   .mainbox{     flex: 8;     border: 1px solid blue;     height: 500px;   } </style>

watch属性的使用

考虑一个问题:想要实现 两个文本框的内容改变,则全名的文本框中的值也跟着改变;(用以前的知识如何实现???)

  1. 监听data中属性的改变:

<div id="app">    <input type="text" v-model="firstName"> +    <input type="text" v-model="lastName"> =    <span>{{fullName}}</span>  </div>​ <script>   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {       firstName: 'jack',       lastName: 'chen',       fullName: 'jack - chen'     },     methods: {},     watch: {       'firstName': function (newVal, oldVal) { // 第一个参数是新数据,第二个参数是旧数据         this.fullName = newVal + ' - ' + this.lastName;       },       'lastName': function (newVal, oldVal) {         this.fullName = this.firstName + ' - ' + newVal;       }     }   }); </script>
  1. 监听路由对象的改变:

<div id="app">    <router-link to="/login">登录</router-link>    <router-link to="/register">注册</router-link>​   <router-view></router-view> </div>​ <script>   var login = Vue.extend({     template: '<h1>登录组件</h1>'   });​   var register = Vue.extend({     template: '<h1>注册组件</h1>'   });​   var router = new VueRouter({     routes: [       { path: "/login", component: login },       { path: "/register", component: register }     ]   });​   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {},     methods: {},     router: router,     watch: {       '$route': function (newVal, oldVal) {         if (newVal.path === '/login') {           console.log('这是登录组件');         }       }     }   }); </script>

computed计算属性的使用

  1. 默认只有getter的计算属性:

<div id="app">    <input type="text" v-model="firstName"> +    <input type="text" v-model="lastName"> =    <span>{{fullName}}</span>  </div>​ <script>   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {       firstName: 'jack',       lastName: 'chen'     },     methods: {},     computed: { // 计算属性; 特点:当计算属性中所以来的任何一个 data 属性改变之后,都会重新触发 本计算属性 的重新计算,从而更新 fullName 的值       fullName() {         return this.firstName + ' - ' + this.lastName;       }     }   }); </script>
  1. 定义有gettersetter的计算属性:

<div id="app">    <input type="text" v-model="firstName">    <input type="text" v-model="lastName">    <!-- 点击按钮重新为 计算属性 fullName 赋值 -->    <input type="button" value="修改fullName" @click="changeName">​   <span>{{fullName}}</span> </div>​ <script>   // 创建 Vue 实例,得到 ViewModel   var vm = new Vue({     el: '#app',     data: {       firstName: 'jack',       lastName: 'chen'     },     methods: {       changeName() {         this.fullName = 'TOM - chen2';       }     },     computed: {       fullName: {         get: function () {           return this.firstName + ' - ' + this.lastName;         },         set: function (newVal) {           var parts = newVal.split(' - ');           this.firstName = parts[0];           this.lastName = parts[1];         }       }     }   }); </script>

watchcomputedmethods之间的对比

  1. computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;

  2. methods方法表示一个具体的操作,主要书写业务逻辑;

  3. watch一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computedmethods的结合体;

nrm的安装使用

作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址; 什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候,我们可以在国内,创建一个和官网完全一样的NPM服务器,只不过,数据都是从人家那里拿过来的,除此之外,使用方式完全一样;

  1. 运行npm i nrm -g全局安装nrm包;

  2. 使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址;

  3. 使用nrm use npmnrm use taobao切换不同的镜像源地址;

相关文件

  1. URL中的hash(井号)

转载于:https://www.cnblogs.com/QianDingwei/p/10800873.html

Vue.js - Day4相关推荐

  1. vue.js 基础学习 11天 -- 转载 某培训机构 学习资料 (转载链接未找到-暂定原创 - 非原创)

    Vue.js - Day1 课程介绍 前5天: 都在学习Vue基本的语法和概念:打包工具 Webpack , Gulp 后5天: 以项目驱动教学: 什么是Vue.js Vue.js 是目前最火的一个前 ...

  2. js处理请求最多的服务器,vue.js 请求服务器

    理解vue ssr原理,自己搭建简单的ssr框架 先附上demo地址:https://github.com/wmui/vue-s... 第一步:编写entry-client.js和entry-serv ...

  3. Vue.js 源码目录设计(二)

    Vue.js 的源码都在 src 目录下,其目录结构如下. src ├── compiler # 编译相关 ├── core # 核心代码 ├── platforms # 不同平台的支持 ├── se ...

  4. 【转】Vue.js 2.0 快速上手精华梳理

    Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...

  5. vue.js安装过程(npm安装)

    一.开发环境 vue推荐开发环境: Node.js: JavaScript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器. webpack: 它主要的用途 ...

  6. laravel ajax vue6,详解用vue.js和laravel实现微信支付

    注:此项是微信公众号开发,请在往下看之前,先实现网页微信授权登陆功能,具体参看我简书的另一篇文章:https://www.jb51.net/article/117004.htm 1.打开app/con ...

  7. js去掉前后空格的函数_2020年最火爆的Vue.js面试题

    2020年Vue面试题 Interview ●●●● 作者:@烦恼会解决烦恼 vue核心知识--理论篇 1.对于Vue是一套渐进式框架的理解 渐进式代表的含义是:主张最少. Vue可能有些方面是不如R ...

  8. 【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定

    子组件sg-component.vue代码 <template><div class="sg-component"><button @click=&q ...

  9. Vue.js双向绑定的实现原理

    Vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例. 一 ...

最新文章

  1. php会员中心模板,会员中心模板
  2. iOS开发UI篇—iOS开发中三种简单的动画设置
  3. FCN训练自己的数据集及测试
  4. Postfix 邮件服务 - 基础服务
  5. Linux下c的进一步学习
  6. java 数据保存内存_java中的各种数据类型在内存中存储的方式 一
  7. 商汤科技回应“IPO推迟”:“被”IPO,还“被”推迟了
  8. Docker学习总结(60)——Docker-Compose 基础知识回顾总结
  9. Spring学习总结(19)——Spring概念详解
  10. 关于输入法图标消失 只能输入英文 win10 语言选项 键盘那里显示 输入法仅桌面的解决办法
  11. 各种三角函数的导数(正六边形记忆法)
  12. 照片变老html源码,变老教程,利用ps把年轻人变成老年人效果
  13. 【英语语法入门】 第31讲 [被动语态 (1)]被动态的构成和含义
  14. 【uniapp微信小程序组件】大转盘抽奖组件
  15. element el-table 计算指定列
  16. python版本降级
  17. jzoj 4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰
  18. python 如何使用 pandas 在 flask web 网页中分页显示 csv 文件数据
  19. IMX6ULL裸机程序--4.时钟树分析
  20. OpenCore Gen-X :一键制作黑苹果OpenCore EFI文件

热门文章

  1. 软件工程概论第十三周学习进度
  2. 【Linux】Linux中文本编辑器和系统管理命令
  3. Alibaba代码规约插件使用IDEA
  4. 性能测试利器工具来了,生产环境全链路压测工具
  5. JMeter集合点功能的使用
  6. 怎么做软件安全性测试
  7. python 列表推导_Python 列表推导式使用的注意事项
  8. python分享文件_使用简单的python http服务共享文件
  9. 深入理解ThreadLocal变量的功能和使用
  10. 前端快速开发插件emmet,炫技必备