赞
踩
1、Vue的标准开发方式
【1】Vue推荐的开发方式是 ------------- SPA(Single Page (Web) Application ) 单页面 Web 应用
【2】什么是 SPA (单页面应用) ?
单页面应用 :就是日后项目中只有一张页面 =========== 》》 》 index . html
【3】为什么Vue推荐开发方式SPA(单页面应用)的开发方式?
a、引入Vue js 文件
b、在现有的页面中创建一个Vue实例对象
一个页面中只能存在一个 Vue 实例
Vue 推荐的开发方式 : 一个应用中只能存在一个Vue实例
【4】使用现有的手段严格遵循SPA存在问题?
a、现有的开发方式会导致项目中唯一一个页面中代码会越来越多,不利于维护
b、现有开发方式导致项目中唯一 一个页面中完成全部业务功能,导致当前页面每次加载的速度非常的慢
【5】为了严格遵循SPA开发方式在Vue中提供了 Vue 组件(component)
组件作用:
1、减少Vue根实例的代码量
2、一个组件负责完成项目中的一个功能或一组功能实现业务功能隔离
3、组件还可以在Vue实现复用
【6】组件如何使用?
a、全局组件:直接注册到vue根实例的组件
Vue.component( ' ' ) // 注册这个就是全局组件
b、局部组件:只能在注册组件中使用的组件
const app = new Vue({
el:" ";
data:{ },
methods:{ },
computed:{ },
created(){ },
components:{ } , // 注册局部组件
})
最大的不同: 作用范围不同 ,如果是全局的,任何地方可用; 如果是局部的,当前组件可用
【7】组件的基本使用
a、全局组件的使用
1)定义组件
Vue.component('login', { //两个参数:参数一:组件名 参数二:组件的配置对象 template: <h2>用户登录</h2>
, //用来书写该组件的html代码 });
2)使用组件
< login> < /login>
<body> <div id="app"> <h1>{{msg}}</h1> <!-- 登录 --> <login></login> <!-- 注册 --> <register></register> </div> </body> </html> <script src="../../js/vue.js"></script> <script> //1、定义一个登录的全局组件 Vue.component('login', { //两个参数:参数一:组件名 参数二:组件的配置对象 template: `<h2>用户登录</h2>`, //用来书写该组件的html代码 }); //1、定义一个注册的全局组件 Vue.component('register', { //两个参数:参数一:组件名 参数二:组件的配置对象 template: `<h2>用户注册</h2>`, //用来书写该组件的html代码 }); </script>
b、局部组件的使用
1)定义组件
- //定义一个局部组件
- components: {
- add: { // 语法: 组件名:{ template:` `}
- template: `<h2>用户添加</h2>`
- }
- }
2)使用组件
- <!-- 添加 -->
- <add></add>
<body> <div id="app"> <!-- 添加 --> <add></add> </div> </body> </html> <script src="../../js/vue.js"></script> <script> const app = new Vue({ el: "#app", data: { msg: "Vue中组件使用" }, methods: { }, computed: { }, created() { }, //定义一个局部组件 components: { add: { // 语法: 组件名:{ template:` `} template: `<h2>用户添加</h2>` } } }) </script>
【8】Vue组件中定义组件数据data 、methods、computed、components
组件的生命周期分为四个阶段:
create(创建)
mount(挂载)
update(更新)
destroy(销毁)
组件中可以定义自己的data 、methods、computed、components、生命周期函数、以及自己的子组件。
<body> <div id="app"> <h1>{{msg}}</h1> <!-- 使用登录组件 --> <login></login> <register></register> </div> </body> </html> <script src="../../js/vue.js"></script> <script> // 定义一个全局组件 Vue.component('register', { template: `<h1>我是全局组件</h1>` }) //定义一个局部组件 const login = { template: `<div><h1>用户登录</h1><h2>{{count}}--------------{{countSqrt}}</h2><h2>{{msg}}</h2><aa></aa><register></register><button @click="add">点我count++</button></div>`, data() { //用来给当前组件定义属于组自己的数据 组件中定义的data必须是一个函数 return { //在return中可以定义数据 count: 0, msg: "我是组件的msg", } }, methods: { add() { this.count++; } }, computed: { countSqrt() { return this.count * this.count; } }, components: { aa: { template: `<h1>我是aa子组件</h1>` } } }; const app = new Vue({ el: "#app", data: { msg: "Vue组件中定义组件的data、methods、components等" }, // 定义一个局部组件 components: { //用来定义局部组件 login, } }) </script>
【9】Vue中父组件向子组件传递数据props
日后 Vue开发: 一切皆组件
(1) props 机制:
1、定义:Vue中提供一个特有数据传递机制
2、作用:在使用Vue组件时,如果需要通过父组件给组件传递数据可以通过 props 进行实现
(2) props的使用:
作用:props用来给组件传递相应静态数据或者是动态数据
a、传递静态数据: 在组件使用的标签上声明静态数据 key = value 在组件定义的内部使用props进行接收数据
注意:使用props机制接收数据就相当于自己组件data中声明一个这样的数据
- <body>
- <div id="app">
- <h1>{{msg}}</h1>
- <login title="我是标题" count="0"></login>
- </div>
- </body>
<script src="../../js/vue.js"></script> <script> //定义组件对象 const login = { props: ['title', 'count'], template: `<div><h1>{{title}} ----------- {{loginTitle}} ----------- {{count}}</h1></div>`, data() { return { loginTitle: this.title, } }, }; const app = new Vue({ el: "#app", data: { msg: "组件之间的数据传递", }, components: { login, } }) </script>
b、传递动态数据
根据属性绑定来实现
单项数据流
- <body>
- <div id="app">
- <h1>{{msg}}</h1>
- <input type="text" v-model="name">
- <!-- 向子组件传递一个动态数据 -->
- <login :name="name" :msg="msg"></login>
- </div>
- </body>
<script src="../../js/vue.js"></script> <script> //定义组件对象 const login = { props: ['name', 'msg'], template: `<div><h1>{{name}} ----------- {{msg}}</h1></div>`, data() { return { } }, }; const app = new Vue({ el: "#app", data: { msg: "组件之间的传递", name: "我是vue实例管理数据" }, components: { login, } }) </script>
【10】Vue中父组件向子组件传递事件并通过事件子组件传递数据到父组件
(1)Vue中父组件向子组件传递事件
在使用组件时,向组件传递事件
1、直接在对应的组件标签上定义 传递的事件即可 @key = value
- <body>
- <div id="app">
- <h1>{{msg}}</h1>
- <login @aa="testParent"></login>
- </div>
- </body>
<script src="../../js/vue.js"></script> <script> const login = { template: `<div><h3>用户登录</h3> <button @click="testChild">点我去掉父组件中某个事件</button></div>`, methods: { testChild() { alert("我是子组件中定义的事件"); //调用父组件中的testParent this.$emit('aa'); //用来调用父组件传递过来的事件 } } }; const app = new Vue({ el: "#app", data: { msg: "组件之间的事件传递", }, methods: { testParent() { alert("我是父组件上的事件") } }, components: { login, } }) </script>
(2)通过事件子组件传递数据到父组件
1、 标签里边 @aa = " 父级事件 " ,在子组件中通过 this.$emit('aa' ,this.count ) 获取 aa 以及 父级事件,并将子组件中的数据this.count 传入到 父级事件以参数形式接收。
- <body>
- <div id="app">
- <h1>{{msg}}{{count}}</h1>
- <login @aa="testParent"></login>
- </div>
- </body>
<script src="../../js/vue.js"></script> <script> //子组件 const login = { template: `<div><h3>用户登录</h3> <button @click="testChild">点我去掉父组件中某个事件</button></div>`, data() { return { count: 19, } }, methods: { testChild() { alert("我是子组件中定义的事件"); //调用父组件中的testParent this.$emit('aa', this.count); //用来调用父组件传递过来的事件 } } }; //父组件 const app = new Vue({ el: "#app", data: { msg: "组件之间的事件传递", count: 0, }, methods: { testParent(count) { alert("我是父组件上的事件"); console.log(count); this.count = count; } }, components: { login, } }) </script>
【11】组件的插槽使用slot
插槽 : slot
作用:用来扩展现有的组件,让组件变得更加灵活
插槽:占位
具名插槽 :带有名字的插槽
默认插槽 :默认插入全部插槽中
- <body>
- <div id="app">
- <h1>{{msg}}</h1>
- <!--
- 插槽:占位
- 具名插槽 :带有名字的插槽
- 默认插槽 :默认插入全部插槽中
- -->
- <login></login>
- <login><span slot="bb">欢迎进入我们的网站{{msg}}</span></login>
- <hr>
- <login><span slot="aa">Welcome come to aa</span></login>
- </div>
- </body>
- <script src="../../js/vue.js"></script>
- <script>
- const login = {
- template: `<div><slot name="aa"></slot><h3>用户登录</h3><slot name="bb"></slot></div>`,
- }
- const app = new Vue({
- el: "#app",
- data: {
- msg: "组件的slot(插槽)使用"
- },
- components: {
- login,
- }
- })
- </script>
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。