[vue]组件最佳实战

时间:2022-04-18 03:06:42

[vue]全局组件和局部组件(嵌套+props引用父组件数据)

[vue]组件篇

[vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick

[vue]实现父子组件数据双向绑定

[vue]render函数渲染组件

[vue]webpack&vue组件工程化实践

组件基础

局部组件 全局组件
定义 定义
注册 -
使用 使用

全局组件(工程中比局部组件更常用)

组件化编程好处: 1,重用性 2,维护性

- 全局组件定义(体会一下重用性)
<div id="app">
<!--重用性-->
<my-awsome></my-awsome>
<my-awsome></my-awsome>
<my-awsome></my-awsome>
<!--组件中使用数据-->
<my-awsome2></my-awsome2>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script> //全局组件: 1,定义 2,使用
Vue.component(
'my-awsome', {
template: "<h1>全局组件: maomao</h1>"
}
); Vue.component(
'my-awsome2', {
template: "<h1>自己的模板里取自己的数据: {{msg}}</h1>",
data(){
return {msg:'maomao-msg'}
}
}
); let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
})
</script>

局部组件(不常用)

- 最简单的局部组件(写法)
<div id="app">
{{msg}}
<awsome></awsome>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
components: {
awsome: {
template: "<h1>最简单的局部组件</h1>"
}
},
})
</script>
- 局部组件(带数据)
1.子组件不能直接获取父组件的数据 <div id="app">
{{msg}}
<awsome></awsome>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
components: {
awsome: {
data: function () { //1,data必须是函数类型
return {count: 0} //2,返回值必须是对象
},
template: "<button @click='count++'>count++: {{count}}</button>"
}
},
})
</script>
- 也可以将对象写在外面(注意: data和template都在对象里)
<div id="app">
{{msg}}
<awsome></awsome>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
let awsome = {
data: function () {
return {count: 0};
},
template: "<button @click='count++'>count++: {{count}}</button>"
}; let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
components: {
awsome: awsome,
},
})
</script>


- 组件之间最好不要共享数据
<div id="app">
<h1>共享数据</h1>
<awsome></awsome>
<awsome></awsome>
<hr>
<h1>独立空间数据</h1>
<awsome2></awsome2>
<awsome2></awsome2>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
// 局部组件使用3步骤: 1,创建 2.注册 3,使用 // 共享数据(数据定义在了componet外部)
let obj = {count: 0};
Vue.component('awsome', {
data: function () {
return obj;
},
template: "<button @click='count++'>awsome: {{count}}</button>"
}
); //独立数据
Vue.component('awsome2', {
data: function () {
return {count: 0};
},
template: "<button @click='count++'>awsome2: {{count}}</button>"
}
);
let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
})
</script>

子组件获取父组件的数据: props

参考: keepfool

<h1>props: 父组件数据传给子组件</h1>
<div id="app">
<awsome :my-name="name" :my-age="age"></awsome>
</div> <script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
name: 'maomao',
age: 22
},
components: {
'awsome': {
template: '<div>name: {{myName}} age:{{myAge}}</div>',
props: ['myName', 'myAge']
}
}
})
</script>

父子组件嵌套

<div id="app">
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
// 如果要在一个组件使用另一个组件,
// 1.先保证使用的组件(父组件)得是真实存在,
// 2.在需要引用这个组件的(子组件)实例上通过components注册这个组件
// 3.组件需要在父级的模板中通过标签的形式引入
let grandson = {
template: '<div>grandson</div>',
};
let son = {
template: '<div>son <grandson></grandson></div>',
components: {grandson}
};
let parent = {
template: '<div>parent <son></son></div>',
components: {son}
}; let vm = new Vue({
el: '#app',
template: '<parent></parent>',
components: {parent}
})
</script>

附:

- 了解一下template(生命周期)
1. 如果有template属性会用模板替换掉外部html,只要有此属性app中的内容就没有任何意义了
2. 只能有一个根元素,不能是文本节点 <div id="app">
{{msg}}
</div> <script src="node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: "#app",
data: {
msg: 'hi'
},
template: "<div>内置组件模板</div>",
})
</script>

props默认是单向绑定

- 子组件的数据更改,不影响父组件
- 父组件的数据更改,会影响子组件 <div id="app">
<h1>父组件数据</h1>
name: {{ name }}
<input type="text" v-model="name"/> <br>
age: {{ age }}
<input type="text" v-model="age"/> <my-component v-bind:my-name="name" v-bind:my-age="age"></my-component>
</div> <template id="myComponent">
<div>
<h1>子组件数据</h1>
myName: {{ myName }}
<input type="text" v-model="myName"/> <br>
myAge: {{ myAge }}
<input type="text" v-model="myAge"/>
</div>
</template> <script src="node_modules/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'maomao',
age: 22
},
components: {
'my-component': {
template: '#myComponent',
props: ['myName', 'myAge']
}
}
})
</script>

参考

- 双向绑定(2.x版本不好使)
<my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component> - 单次绑定
<my-component v-bind:my-name.once="name" v-bind:my-age.once="age"></my-component>

webpack中使用全局组件和局部组件

vue组件有两种,一种是全局组件,一种是局部组件。整个项目经常用到的用全局写法,用到比较少的专供特定页面用的使用局部组件。

全局组件引入写法:在项目的main.js中:

import Vue from 'vue';
import MyComponent from '@/components/MyComponent.vue'; // 导入自己写的组件文件 Vue.use(MyComponent); // 自定义全局组件的时候需要Vue.use(); Vue.component('my-component', MyComponent); //初始化组件 new Vue({
el: '#app',
router,
components: {
App,
MyComponent
},
template: '<App/>',
});

局部组件引入写法:在需要使用组件的a.vue文件中:

<template>
</template> <script>
import MyComponent from '@/components/MyComponent.vue';
export default {
components: {MyComponent}, // 直接初始化就可以啦,不需要Vue.use();
data() {},
methods: {}
};
</script> <style lang="scss" scoped>
</style>

下面附上自定义组件的MyComponent.vue文件代码:

<template>
<div>
<a @click="methods1()"></a>
</div>
</template>
<script>
import { MessageBox } from 'mint-ui';
export default {
data () { // 组件内参数定义在data中
return {
data1: {}
};
},
props: { // 组件传参使用props
value1: String,
value2: Number
},
methods: { // 组件的计算方法
methods1 () {
}
}
};
</script>
<style lang="scss" scoped>
</style>

参考:

https://blog.csdn.net/ywl570717586/article/details/79984909

webpack vue的几种引入方式: http://vue2.mmxiaowu.com/article/584a3957fc007e72b0f576d9

[vue]组件最佳实战的更多相关文章

  1. vue组件最佳实践

    看了老外的一篇关于组件开发的建议(强烈建议阅读英文原版),感觉不错翻译一下加深理解. 这篇文章制定一个统一的规则来开发你的vue程序,以至于达到一下目的. 1.让开发者和开发团队更容易发现一些事情. ...

  2. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  3. 极客时间&lowbar;Vue开发实战&lowbar;05&period;Vue组件的核心概念&lpar;1&rpar;:属性

    05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...

  4. 极客时间&lowbar;Vue开发实战&lowbar;06&period;Vue组件的核心概念&lpar;2&rpar;:事件

    06.Vue组件的核心概念(2):事件 通过emit传递给父组件 我们点击了重置失败,上层的div的click=handleDivClick是接收不到.重置失败的点击的行为的 通常情况下,你不用.st ...

  5. 极客时间&lowbar;Vue开发实战&lowbar;07&period;Vue组件的核心概念&lpar;3&rpar;:插槽

    07.Vue组件的核心概念(3):插槽 严格来的说在2.0之后已经不分区这两种插槽的概念了. 因为它底层的实现已经趋向于相同了. 2.6为了兼容2.5的版本,现在依然可以用这两种写法 作用域插槽就是多 ...

  6. vue2 入门 教程 单页应用最佳实战&lbrack;&ast;&ast;&ast;&ast;&ast;&rsqb;

    推荐 vue2 入门 教程 -------- 看过其他的,再看作者的,很赞 vue2 入门 教程 单页应用最佳实战 :  具体在 https://github.com/MeCKodo/vue-tuto ...

  7. vue2&period;0 构建单页应用最佳实战

    vue2.0 构建单页应用最佳实战   前言 我们将会选择使用一些 vue 周边的库vue-cli, vue-router,vue-resource,vuex 1.使用 vue-cli 创建项目2.使 ...

  8. vue&plus;webpack项目实战

    概述 -- 项目中会用到的插件 vue-router vue-resource 打包工具 webpack 依赖环境 node.js start 安装vue开发的模板 # 全局安装 vue-cli $ ...

  9. vue&plus;vue-router&plus;vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

随机推荐

  1. Change the Target Recovery Time of a Database &lpar;SQL Server&rpar; 间接-checkpoints flushcache flushcache-message

    Change the Target Recovery Time of a Database (SQL Server) 间接checkpoints   flushcache flushcache-mes ...

  2. Xamarin&period;ios引用第三方SDK

    引言 诚然,Xamarin是个优秀的跨平台解决方案,但毕竟还是不能将Native中所有的方法都直接实现.诸如各种第三方库,也都只有java/oc原生版本的SDK,无法直接拿过来直接使用.但,不能直接拿 ...

  3. 【转】js 关键字 in 的使用方法

    js 关键字 in 的使用方法  原文地址:http://sunct.iteye.com/blog/1709017   1.For...In 声明用于对数组或者对象的属性进行循环/迭代操作. 对于数组 ...

  4. &lbrack;z&rsqb; 人工智能和图形学、图像处理方面的各种会议的评级

    转载自:『http://www.cvchina.info/2010/08/31/conference-ranking-byar/』 澳大利亚*和澳大利亚研究理事会做的,有一定考价值. 会议名称 会议 ...

  5. &lbrack;转&rsqb; 关于hibernate的缓存使用

    http://blog.csdn.net/woshichenxu/article/details/586361 1.     关于hibernate缓存的问题: 1.1.1.         基本的缓 ...

  6. Ext&period;Net学习笔记09:Ext&period;Net Store的用法

    使用Handler处理分页 首先来创建一般处理程序,我命名为StoreHandler.ashx,然后它的处理过程代码如下: public void ProcessRequest(HttpContext ...

  7. 201521123092《java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4 ...

  8. FWT模板

    代码来自51nod1570 #include<cstdio> #include<cstring> #include<algorithm> #define MN 50 ...

  9. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...

  10. PHP实现 APP端微信支付功能

    1.我封装好的一个支付类文件,多余的东西都去除掉了,并且把配置参数放到了这个支付类中,只需要修改Weixinpayandroid方法内的几个参数就可以直接复制使用: class Wxpayandroi ...