vue之component
因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。
组件基础:
全局组件:可以在任何(根)实例中使用的组件;
局部组件:只能在某一实例中使用的组件:
一、定义全局组件和局部组件的两种方法:
方法一:定义一个全局组件和局部组件
全局组件:
局部组件:
方法二:定义一个全局组件和局部组件
全局组件:
局部组件:
方法三、使用template定义
方法四、使用script定义
方法五:在模块系统中局部注册
你使用了诸如 Babel 和 webpack 的模块系统。在这些情况下,我们推荐创建一个 components 目录,并将每个组件放置在其各自的文件中。
然后你需要在局部注册之前导入每个你想使用的组件。例如,在一个假设的 ComponentB.js 或 ComponentB.vue 文件中:
现在 ComponentA 和 ComponentC 都可以在 ComponentB 的模板中使用了。
二、父子组件:
三、父子组件通信:从父到子,用props属性绑定
五、平行组件传递数据:用空实例搭建桥梁
六、prop:
1、在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
2、prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等) 在 default 或 validator 函数中是不可用的。
七、is:
解析 DOM 模板时的注意事项
有些 HTML 元素,诸如 <ul>、<ol>、<table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li>、<tr> 和 <option>,只能出现在其它某些特定的元素内部。
这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:
这个自定义组件 <blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:
再比如:
八、动态组件:使用:is在不同组件之间进行动态切换:
让多个组件使用同一个挂载点,并动态切换,这就是动态组件。通过 Vue 的 <component> 元素加一个特殊的 is 特性来实现。
示例:
也可以直接绑定到组件对象上:
九、在动态组件上使用 keep-alive:
重新创建动态组件的行为通常是非常有用的,但是在有些应用中,我们更希望那些标签的组件实例能够被在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个 <keep-alive> 元素将其动态组件包裹起来。
条件判断:
如果有多个条件性的子元素,<keep-alive> 要求同时只有一个子元素被渲染。
十、异步组件:
vue开发过程中,我们会做出特别多特别多的组件,包括login,header,footer,main等等。
这样使整个网站看起来就十分的庞大,当我们在打开网页的时候,突然一下子把这些所有的组件加载上来,这么多的请求全部同时开始请求,势必会造成网页打开很慢,使客户得到的是非常差劲的体验。
因此,vue为我们专门设立了异步组件,通过异步组件,我们可以得到两点好处:
1、用不到的组件不会加载,因此网页打开速度会很快,当你用到这个组件的时候,才会通过异步请求进行加载;
2、缓存组件,通过异步加载的组件会缓存起来,当你下一次再用到这个组件时,丝毫不会有任何的疑迟,组件很快会从缓存中加载出来。
为了简化,Vue 允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。例如:
如你所见,这个工厂函数会收到一个 resolve 回调,这个回调函数会在你从服务器得到组件定义的时候被调用。你也可以调用 reject(reason) 来表示加载失败。这里的 setTimeout 是为了演示用的,如何获取组件取决于你自己。
一个推荐的做法是将异步组件和 webpack 的 code-splitting 功能一起配合使用:
实例1:
假如你写一个test.vue文件,在<script>标签里,实际使用方法如下:
更简单的异步组件的使用方法:
可以用到异步组件的地方:
1、组件中,组件中需要子组件的位置,我们就可以使用异步组件形式;
2、路由中,一般我们打开一个页面时,其总是会进入其中一个默认的路由,那么其他路由在用不到的时候就没必要继续加载,当跳转到当前路由的时候,再来加载,这里也是使用异步组件非常恰当的地方。
十一、在组件上使用 v-model:
这里的 searchText 的值将会传入这个名为 value的 prop。同时当 <custom-input> 触发一个 input 事件并附带一个新的值的时候,这个 searchText 的属性将会被更新。