当前位置:   article > 正文

官方文档Vue_vue官方文档

vue官方文档

 组件的复用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <!-- 自定义组件的使用 -->
  12. <div id="app">
  13. <me-cute></me-cute>
  14. <me-cute></me-cute>
  15. </div>
  16. <script>
  17. Vue.component("me-cute",{
  18. template:'<h2>我可爱</h2>'
  19. })
  20. // 现在我要使用组件,实现复用
  21. new Vue({
  22. el:"#app",
  23. data:{
  24. }
  25. })
  26. </script>
  27. </body>
  28. </html>

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <!-- 自定义组件的使用 -->
  12. <div id="app">
  13. <me-cute title="啦啦啦"></me-cute>
  14. <me-cute title="哈哈哈"></me-cute>
  15. </div>
  16. <script>
  17. Vue.component("me-cute",{
  18. template:'<h2>我可爱{{title}}</h2>',
  19. props:['title']
  20. })
  21. // 现在我要使用组件,实现复用
  22. new Vue({
  23. el:"#app",
  24. data:{
  25. }
  26. })
  27. </script>
  28. </body>
  29. </html>

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="blog-post-demo">
  12. <!-- 这里直接把post给绑上了 v-bind:post="post"-->
  13. <blog-post v-for="post in posts" v-bind:id="post.id" v-bind:post="post"></blog-post>
  14. </div>
  15. <script>
  16. Vue.component("blog-post",{
  17. props:['post'],
  18. // 这里这样写,可以写多个属性
  19. template:`
  20. <div class="blog-post">
  21. <h2>{{post.id}}--{{post.title}}</h2>
  22. </div>
  23. `
  24. })
  25. new Vue({
  26. el:"#blog-post-demo",
  27. data:{
  28. posts:[
  29. {id:1,title:'My Journey with Vue'},
  30. {id:2,title:'Blgging with Vue'},
  31. {id:3,title:'Why Vue is so fun'}
  32. ],
  33. }
  34. })
  35. </script>
  36. </body>
  37. </html>

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <!-- 自定义组件使用 -->
  12. <div id="components-demo">
  13. <button-counter></button-counter>
  14. </div>
  15. <script>
  16. Vue.component('button-counter',{
  17. data:function(){
  18. return {
  19. count:0
  20. }
  21. },
  22. template:'<button v-on:click="count++">You clicked me {{count}} times.</button>'
  23. })
  24. // 实列
  25. new Vue({
  26. el:"#components-demo"
  27. })
  28. </script>
  29. </body>
  30. </html>

组件的复用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <!-- 自定义组件使用 -->
  12. <div id="components-demo">
  13. <!-- 组件的复用 -->
  14. <button-counter></button-counter></br></br/>
  15. <button-counter></button-counter><br/></br/>
  16. <button-counter></button-counter>
  17. </div>
  18. <script>
  19. Vue.component('button-counter',{
  20. data:function(){
  21. return {
  22. count:0
  23. }
  24. },
  25. template:'<button v-on:click="count++">You clicked me {{count}} times.</button>'
  26. })
  27. // 实列
  28. new Vue({
  29. el:"#components-demo"
  30. })
  31. </script>
  32. </body>
  33. </html>

prop子组件传递数据

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <!-- 通过prop向子组件传数据 -->
  12. <!-- 任何值都可以传递给prop,通过它展示出来 -->
  13. <div id="app">
  14. <blog-post title="MY JOURNEY WITH YOU"></blog-post>
  15. <blog-post title="Blogging with Vue"></blog-post>
  16. <blog-post title="Why Vue is so fun"></blog-post>
  17. </div>
  18. <script>
  19. // 组件
  20. Vue.component('blog-post',{
  21. props:['title'],
  22. template:'<h3>{{title}}</h3>'
  23. })
  24. new Vue({
  25. el:"#app",
  26. data:{
  27. }
  28. })
  29. </script>
  30. </body>
  31. </html>
key绑定id,id不会出现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="blog-post-demo">
  12. <blog-post v-for="post in posts" v-bind:key="post.id" v-bind:title="post.title"></blog-post>
  13. </div>
  14. <script>
  15. Vue.component("blog-post",{
  16. props:["title"],
  17. template:"<h3>{{title}}</h3>"
  18. })
  19. new Vue({
  20. el:"#blog-post-demo",
  21. data:{
  22. posts:[
  23. {id:1,title:'My Journey with Vue'},
  24. {id:2,title:'Blgging with Vue'},
  25. {id:3,title:'Why Vue is so fun'}
  26. ],
  27. }
  28. })
  29. </script>
  30. </body>
  31. </html>

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="blog-post-demo">
  12. <blog-post v-for="post in posts" v-bind:id="post.id" v-bind:title="post.title"></blog-post>
  13. <!-- 下面没有绑定值 -->
  14. <blog-post></blog-post>
  15. </div>
  16. <script>
  17. Vue.component("blog-post",{
  18. props:["id","title"],
  19. // 这里这样写,可以写多个属性
  20. template:`
  21. <div class="blog-post">
  22. <h2>{{id}}--{{title}}</h2>
  23. </div>
  24. `
  25. })
  26. new Vue({
  27. el:"#blog-post-demo",
  28. data:{
  29. posts:[
  30. {id:1,title:'My Journey with Vue'},
  31. {id:2,title:'Blgging with Vue'},
  32. {id:3,title:'Why Vue is so fun'}
  33. ],
  34. }
  35. })
  36. </script>
  37. </body>
  38. </html>

监听子组件事件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="blog-posts-events-demo">
  12. <div :style="{fontSize:postFontSize+'em'}">
  13. <!--父组件子组件都可以听过v-on来实现控制 -->
  14. <blog-post
  15. v-on:enlarge-text="postFontSize+=0.1"
  16. v-for="post in posts"
  17. v-bind:key="post.id"
  18. v-bind:post="post">
  19. </blog-post>
  20. </div>
  21. </div>
  22. <script>
  23. Vue.component("blog-post",{
  24. props:['post'],
  25. // <h3>里的内容写法决定data数组里的内容显示哪些
  26. //$emit方法提供了触发事件的机会
  27. template:`
  28. <div class="blog-post">
  29. <h3>{{post.id}}-----{{post.title}}</h3>
  30. <button v-on:click="$emit('enlarge-text')">
  31. Enlarge text
  32. </button>
  33. <div v-html="post.content"></div>
  34. </div>
  35. `
  36. })
  37. new Vue({
  38. el:"#blog-posts-events-demo",
  39. data:{
  40. posts:[ {id:1,title:'My Journey with Vue'},
  41. {id:2,title:'Blgging with Vue'},
  42. {id:3,title:'Why Vue is so fun'} ],
  43. // 这个非常重要
  44. postFontSize:1
  45. }
  46. })
  47. </script>
  48. </body>
  49. </html>

使用事件抛出一个值

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="blog-posts-events-demo">
  12. <div :style="{fontSize:postFontSize+'em'}">
  13. <!--父组件子组件都可以听过v-on来实现控制 -->
  14. <!-- 这样就是动态的了 $event -->
  15. <!-- 可以通过$event访问到被抛出的值0.3 -->
  16. <blog-post
  17. v-on:enlarge-text="postFontSize+=$event"
  18. v-for="post in posts"
  19. v-bind:key="post.id"
  20. v-bind:post="post">
  21. </blog-post>
  22. </div>
  23. </div>
  24. <script>
  25. Vue.component("blog-post",{
  26. props:['post'],
  27. // <h3>里的内容写法决定data数组里的内容显示哪些
  28. //$emit方法提供了触发事件的机会
  29. // $emit第二个参数决定文本放大几倍
  30. template:`
  31. <div class="blog-post">
  32. <h3>{{post.id}}-----{{post.title}}</h3>
  33. <button v-on:click="$emit('enlarge-text',0.3)">
  34. Enlarge text
  35. </button>
  36. <div v-html="post.content"></div>
  37. </div>
  38. `
  39. })
  40. new Vue({
  41. el:"#blog-posts-events-demo",
  42. data:{
  43. posts:[ {id:1,title:'My Journey with Vue'},
  44. {id:2,title:'Blgging with Vue'},
  45. {id:3,title:'Why Vue is so fun'} ],
  46. // 这个非常重要
  47. postFontSize:1
  48. }
  49. })
  50. </script>
  51. </body>
  52. </html>

在组件上使用v-model

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. 你好: <input v-bind:value="searchText" v-on:input="searchText"></br>
  13. 你是? <custom-input v-model="searchText"></custom-input>
  14. </div>
  15. <!-- v-model是其他方式的简便写法 -->
  16. <!-- <input v-model="searchText"> -->
  17. <script>
  18. Vue.component('custom-input',{
  19. props:['value'],
  20. template:`
  21. <input v-bind:value="value"
  22. v-on:input="$emit('input',$event.target.value)">
  23. `
  24. })
  25. const app= new Vue({
  26. el:"#app",
  27. data:{
  28. searchText:'你好'
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

slot 插槽用在组件中

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <alert-box>SOmething bad happend</alert-box>
  13. </div>
  14. <script>
  15. Vue.component('alert-box',{
  16. // 在slot前后面可以随意加其他的内容,
  17. template:`
  18. <div class="demo-alert-box">
  19. <strong>ERROR!</strong>
  20. <h2>我喜欢你</h2>
  21. <slot></slot>
  22. <h2>你喜欢我吗?</h2>
  23. </div>
  24. `
  25. })
  26. new Vue({
  27. el:"#app",
  28. data:{
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

动态组件 is

切换选项卡

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. <style>
  10. <style>
  11. .tab-button {
  12. padding: 6px 10px;
  13. border-top-left-radius: 3px;
  14. border-top-right-radius: 3px;
  15. border: 1px solid #ccc;
  16. cursor: pointer;
  17. background: #f0f0f0;
  18. margin-bottom: -1px;
  19. margin-right: -1px;
  20. }
  21. .tab-button:hover {
  22. background: #e0e0e0;
  23. }
  24. .tab-button.active {
  25. background: #e0e0e0;
  26. }
  27. .tab {
  28. border: 1px dotted #ccc;
  29. padding: 10px;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div id="app" class="demo">
  35. <button
  36. v-for="tab in tabs"
  37. v-bind:key="tab"
  38. v-bind:class="['tab-button', { active: currentTab === tab }]"
  39. v-on:click="currentTab = tab"
  40. >
  41. {{tab}}
  42. </button>
  43. <!-- 当currentTabComponet 改变时,is也会改变 -->
  44. <!-- 不能理解这里代码 -->
  45. <component v-bind:is="currentTabComponent" class="tab"></component>
  46. </div>
  47. <script>
  48. Vue.component("tab-home", {
  49. template: "<div>Home component</div>"
  50. });
  51. Vue.component("tab-posts", {
  52. template: "<div>Posts component</div>"
  53. });
  54. Vue.component("tab-archive", {
  55. template: "<div>Archive component</div>"
  56. });
  57. new Vue({
  58. el:"#app",
  59. data:{
  60. currentTab: "Home",
  61. tabs:["Home","posts","Archive"]
  62. },
  63. computed: {
  64. currentTabComponent: function() {
  65. return "tab-" + this.currentTab.toLowerCase();
  66. }
  67. }
  68. });
  69. </script>
  70. </body>
  71. </html>

解析DOM模板时的注意事项

我个人做例子的时候并没有报错,虽然我只做了一个例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. <!-- <script type="text/x-template"></script> -->
  10. </head>
  11. <body>
  12. <div id="app">
  13. <table>
  14. <blog-post-row></blog-post-row>
  15. </table>
  16. </div>
  17. <script>
  18. Vue.component("blog-post-row",{
  19. template:`
  20. <tr>
  21. <td>1</td>
  22. <td>2</td>
  23. </tr>
  24. `
  25. })
  26. new Vue({
  27. el:"#app",
  28. data:{
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

组件名

注册组件的时候,需要给他起一个名字,这个名字位置就是第一个参数

Vue.component('组件名',{

})

组件吗命名方式有两种  xxx-xxx 横线连接小写单词    my-conponent

                                        单词首字母大写,也就是驼峰命名方法  MyComponent

全局组件

全局组件的注册行为必须在Vue实例new Vue 创建之前发生。

任何地方都可以用

Vue.component('my-component',{

})

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 这里用了 -->
  13. <my-cute></my-cute>
  14. </div>
  15. <div id="ccc">
  16. <!-- 这里也用了 -->
  17. <my-cute></my-cute>
  18. </div>
  19. <script>
  20. // 全局组件
  21. Vue.component('my-cute',{
  22. template:`
  23. <div>我最可爱了</div>
  24. `
  25. })
  26. new Vue({
  27. el:"#app",
  28. data:{
  29. }
  30. })
  31. new Vue({
  32. el:"#ccc",
  33. data:{
  34. }
  35. })
  36. </script>
  37. </body>
  38. </html>

局部组件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <component-a></component-a>
  13. <component-b></component-b>
  14. </div>
  15. <script>
  16. // 局部组件
  17. var ComponentA={
  18. template:`
  19. <div>我有钱</div>
  20. `
  21. }
  22. var ComponentB={
  23. template:`
  24. <div>我有很多钱</div>
  25. `
  26. }
  27. new Vue({
  28. el:"#app",
  29. // 局部组件引入,注意有s
  30. // 前面是页面引用名,后面是局部组件名
  31. components:{
  32. 'component-a' :ComponentA,
  33. 'component-b':ComponentB
  34. }
  35. })
  36. </script>
  37. </body>
  38. </html>

局部组件之间也可以有父子关系,局部组件的套用不是很懂

局部注册的组件在其子组件中不可用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <component-a></component-a>
  13. <component-b></component-b>
  14. </div>
  15. <script>
  16. // 局部组件
  17. var ComponentA={
  18. template:`
  19. <div>我有钱</div>
  20. `
  21. }
  22. var ComponentB={
  23. components:{
  24. 'component-a':ComponentA
  25. },
  26. template:`
  27. <h4>我好有钱</h4>
  28. `
  29. }
  30. new Vue({
  31. el:"#app",
  32. // 局部组件引入,注意有s
  33. // 前面是页面引用名,后面是局部组件名
  34. components:{
  35. 'component-a':ComponentA,
  36. 'component-b':ComponentB
  37. }
  38. })
  39. </script>
  40. </body>
  41. </html>

模块系统

这里的知识点很重要+vue单文件

prop的命名

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <!-- 引入的cdn -->
  9. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  10. </head>
  11. <body>
  12. <div id="app">
  13. <!-- 注意:页面中postitle的写法为 短横线分隔命名法-->
  14. <!-- 组件中是 驼峰命名法 -->
  15. <!-- 使用字符串模块的话,这个限制就不存在 -->
  16. <blog-post post-title="hello"></blog-post>
  17. </div>
  18. <script >
  19. Vue.component('blog-post',{
  20. props:['postTitle'],
  21. template:`
  22. <h3>
  23. {{postTitle}}
  24. </h3>
  25. `
  26. })
  27. new Vue({
  28. el:"#app",
  29. data:{
  30. }
  31. })
  32. </script>
  33. </body>
  34. </html>

Prop类型

注意:写的时候是props

prop的类型有两种 字符串数组 和 对象

                                                         对象 是指定名称和值类型

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <my-cute name="lili" age="18" hobbiy="moeny" ></my-cute>
  13. </div>
  14. <script>
  15. Vue.component('my-cute',{
  16. props:['name','age','hobbiy'],
  17. // 写多个必须加个div包起来
  18. template:`
  19. <div class="my-cute">
  20. <h3>{{name}}</h3>
  21. <h3>{{age}}</h3>
  22. <h3>{{hobbiy}}</h3>
  23. </div>
  24. `
  25. })
  26. new Vue({
  27. el:"#app",
  28. data:{
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

对象

传递静态的prop

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <ku title="money song"></ku>
  13. </div>
  14. <script>
  15. // 给prop传递一个静态的值
  16. Vue.component('ku',{
  17. props:["title"],
  18. template:`
  19. <h3>{{title}}</h3>
  20. `
  21. })
  22. new Vue({
  23. el:"#app"
  24. })
  25. </script>
  26. </body>
  27. </html>

传递动态的prop

就是把prop data v-bind联合起来一起用

应该就是把data的值通过props传递到页面内。(可能搞错了,因为data的值可以直接插入到页面中。)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <sunny v-bind:sun="sunlight"></sunny>
  13. </div>
  14. <script>
  15. Vue.component('sunny',{
  16. // sunlight 太阳 sunny 晴天
  17. //灵魂是props的名字和data里的名字要不一样
  18. props:["sun"],
  19. template:`
  20. <h3>{{sun}}</h3>
  21. `
  22. })
  23. new Vue({
  24. el:"#app",
  25. data:{
  26. sunlight:"红色"
  27. }
  28. })
  29. </script>
  30. </body>
  31. </html>

传入一个数字

不是很懂官方文档想要表达什么意思

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 即便42是静态的,我们仍然需要v-bind来告诉Vue -->
  13. <!-- 这是一个javascript表达式而不是一个字符串 -->
  14. <blog-post v-bind:likes="42"></blog-post>
  15. <!-- 用变量进行动态赋值 -->
  16. <blog-post v-bind:likes="post.likes"></blog-post>
  17. </div>
  18. <script>
  19. Vue.component('blog-post',{
  20. props:['likes'],
  21. template:`
  22. <h3>{{likes}}</h3>
  23. `
  24. })
  25. new Vue({
  26. el:"#app",
  27. data:{
  28. post:{
  29. likes:41
  30. }
  31. }
  32. })
  33. </script>
  34. </body>
  35. </html>

传入一个布尔值

我就不明白 is-published是哪来的!!!!!!!!!!!

布尔值不写了,要么就是我前面都错了,要么就是........!!!!!!!!!!

所以不喜欢看这种说半截的啊啊啊啊啊啊啊啊啊啊

烦死了...................

之后补视频看看.....................

prop没有值

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 包含该prop没有值得情况下,都意味着true -->
  13. <!-- 这个就是prop没有值 -->
  14. <!-- 笑死,根本看不懂官方文档哈哈哈哈哈 -->
  15. <blog-post ></blog-post>
  16. </div>
  17. <script>
  18. Vue.component('blog-post',{
  19. props:[],
  20. template:`
  21. <h2>{{ }}</h2>
  22. `
  23. })
  24. new Vue({
  25. el:"#app",
  26. data:{
  27. }
  28. })
  29. </script>
  30. </body>
  31. </html>

传入一个数组

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 即便数组是一个静态的,我们任然需要v-bind来告诉Vue -->
  13. <!-- 这是一个javascript表达式而不是一个字符串 -->
  14. <!-- 这里是通过 props+v-bind -->
  15. <blog-post v-bind:comment-ids="[234,266,273]"></blog-post>
  16. <!-- 用一个变量进行动态赋值 -->
  17. <!-- 这里是 props+data+v-bind -->
  18. <blog-post v-bind:comment-ids="post.commentIds"></blog-post>
  19. </div>
  20. <script>
  21. Vue.component("blog-post",{
  22. props:['commentIds'],
  23. template:`
  24. <h3>{{commentIds}}</h3>
  25. `
  26. })
  27. new Vue({
  28. el:"#app",
  29. data:{
  30. // 为了做区分,用不同的数字
  31. post:{
  32. commentIds:['23','26','27']
  33. }
  34. }
  35. })
  36. </script>
  37. </body>
  38. </html>

传入一个对象

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 即便对象是静态的,我们仍然需要v-bind来告诉Vue -->
  13. <!-- 这是一个javascript表达式而不是一个字符串 -->
  14. <blog-post v-bind:author="{
  15. name:'Veronica',
  16. company:'Veridian Dynamic'
  17. }"
  18. ></blog-post>
  19. <!-- 用一个变量进行动态赋值 -->
  20. <blog-post v-bind:author='post.author'></blog-post>
  21. </div>
  22. <script>
  23. // props里的内容要加引号,不然会报错
  24. Vue.component('blog-post',{
  25. props:['author'],
  26. template:`
  27. <h3> {{author}}</h3>
  28. `
  29. })
  30. new Vue({
  31. el:"#app",
  32. data:{
  33. post:{
  34. author:{
  35. name:"lili",
  36. company:"tengxu"
  37. }
  38. }
  39. }
  40. })
  41. </script>
  42. </body>
  43. </html>

传入一个对象的所有property

就是在页面显示的元素,不用写很多东西了。

不是官方例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 注意:这里因为没有循环所以无法取具体值,强行取id title值会报错 -->
  13. <blog-post v-bind:post="posts"></blog-post>
  14. </div>
  15. <script>
  16. Vue.component('blog-post',{
  17. props:['post'],
  18. template:`
  19. <h2>{{post}}</h2>
  20. </div>
  21. `
  22. })
  23. new Vue({
  24. el:"#app",
  25. data:{
  26. posts:{
  27. id:1,
  28. title:"My journey with Vue"
  29. }
  30. }
  31. })
  32. </script>
  33. </body>
  34. </html>

注意:上个例子和这个的区别

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 注意:这里循环后,需要把取出来的值单独放出来,所以v-bind:post=post -->
  13. <blog-post v-for="post in posts" v-bind:post="post"></blog-post>
  14. </div>
  15. <script>
  16. Vue.component('blog-post',{
  17. props:['post'],
  18. template:`
  19. <h2>{{post}}</h2>
  20. </div>
  21. `
  22. })
  23. new Vue({
  24. el:"#app",
  25. data:{
  26. posts:{
  27. id:1,
  28. title:"My journey with Vue"
  29. }
  30. }
  31. })
  32. </script>
  33. </body>
  34. </html>

这个应该跟官方的等价于差不多

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <blog-post v-bind:id="posts.id" v-bind:title="posts.title"></blog-post>
  13. <!-- 测试看是哪一方面的问题 -->
  14. <h2>{{posts.id}}</h2>
  15. <h2>{{posts.title}}</h2>
  16. </div>
  17. <script>
  18. Vue.component('blog-post',{
  19. // 这里真的绝了,我报了一上午的错。就一直找不到id,直接这样写就没错了.
  20. props:['id','title'],
  21. template:`
  22. <div class="blog-post">
  23. <h2>{{id}}</h2>
  24. <h2>{{title}}</h2>
  25. </div>
  26. `
  27. })
  28. new Vue({
  29. el:"#app",
  30. data:{
  31. posts:{
  32. id:1,
  33. title:"My journey with Vue"
  34. }
  35. }
  36. })
  37. </script>
  38. </body>
  39. </html>
官方简写 ,有时候真相就这么简单,不过我已然掉进了深深的漩涡,爬不起来。微笑

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <blog-post v-bind="post"></blog-post>
  13. </div>
  14. <script>
  15. Vue.component('blog-post',{
  16. // 这里没想到吧!这么简单哈哈哈哈哈呜呜呜呜呜呜
  17. props:['id','title'],
  18. template:`
  19. <h2>{{id}}--{{title}}</h2>
  20. `
  21. })
  22. new Vue({
  23. el:"#app",
  24. data:{
  25. post:
  26. { id:1, title:"My journey with Vue"}
  27. }
  28. })
  29. </script>
  30. </body>
  31. </html>

掉进了深坑,会另外开一篇文章,说下

单向数据流

prop具有的特性是父子之间是单向下行绑定的状态,父级的更新了,子组件也会更新。但是子组件的更新,父级不会。这样的好处是key防止子组件变更父组件。

下面有两种常见试图变更一个prop的情形:

1.这个prop用来传递一个初始值;这个子组件接下来希望将其作为一个本地的prop数据来使用,在这种情况下,最好定义一个本地的data property并将这个prop用作其初始值。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. </head>
  11. <body>
  12. <div id="app">
  13. <blog-post v-bind:initial-counter=initialCounter.money></blog-post>
  14. </div>
  15. <script>
  16. Vue.component('blog-post',{
  17. props:['initialCounter'],
  18. template:`
  19. <h2>{{initialCounter}}</h2>
  20. `,
  21. data:function(){
  22. return {
  23. counter:this.initialCounter
  24. }
  25. }
  26. })
  27. const app= new Vue({
  28. el:"#app",
  29. data:{
  30. initialCounter:{
  31. money:100000000
  32. }
  33. }
  34. })
  35. </script>
  36. </body>
  37. </html>

2.这个prop以一种原始的值传入且需要进行转换,在这种情况下,最好使用prop的值来定义一个计算属性。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <df v-bind:size="size"></df>
  13. </div>
  14. <script>
  15. Vue.component('df',{
  16. props:['size'],
  17. template:`
  18. <h2>{{size}}</h2>`,
  19. computed:{
  20. normalizedSize:function(){
  21. return this.size.trim().toLowerCase()
  22. }
  23. }
  24. })
  25. new Vue({
  26. el:"#app",
  27. data:{
  28. size:40
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

注意:在jsvascript中对象和数组是通过引用传入的,所有对于一个数组和对象类型的来说,在子组件中改变变更这个数组或数组将影响父组件的状态。

我根本不知道写这两个例子的目的是什么?????

prop验证

可以为组件指定验证要求,指定值类型。

为了定制prop的验证方式,你可以为props中的值提供一个带有验证需求的对象,而不是一个字符串数组。

但是prop会在一个组件实例创建之前进行验证,所有实例的property在default/validator函数中是不可用的。

还有一个不知道如何写

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <my-component v-bind="post"></my-component>
  13. </div>
  14. <script>
  15. Vue.component('my-component',{
  16. props:{
  17. title:String,
  18. content:[String,Number],
  19. author:{type:String,
  20. required:true},
  21. salary:{
  22. // 默认值这里不是很能理解,因为salary的值设为啥就显示啥,没有影响啊
  23. type:Number,
  24. default:8000
  25. },
  26. name:{
  27. type:Object,
  28. default:function(){
  29. return {message:"聚财宝"}
  30. }
  31. }
  32. },
  33. template :`
  34. <div class="my-component">
  35. <h2>{{title}}</h2>
  36. <h2>{{content}}</h2>
  37. <h2>{{author}}</h2>
  38. <h2>{{salary}}</h2>
  39. <h2>{{name}}</h2>
  40. </div>
  41. `
  42. })
  43. new Vue({
  44. el:"#app",
  45. data:{
  46. post:{
  47. title:"大风来啦",
  48. content:10000,
  49. author:"李虎",
  50. salary:8000,
  51. // 不确定这个写法对不对
  52. name:{meaasge:"聚财宝"}
  53. }
  54. }
  55. })
  56. </script>
  57. </body>
  58. </html>

 官方的格式

  1. Vue.component('my-component',{
  2. props:{
  3. //基础类型检查(null和undefined 会通过任何类型)
  4. propA:Number,
  5. // 多个可能的类型
  6. propB:[String,Number],
  7. //必填的字符串
  8. propC:{
  9. type:String,
  10. required:true
  11. },
  12. //带有默认值的数字
  13. propD:{
  14. type:Number,
  15. default:100
  16. },
  17. //带有默认值的对象
  18. type:Object,
  19. //数组或对象默认值必须从一个工厂函数获取
  20. default:function(){
  21. return {message:'hello'}
  22. }
  23. },
  24. //自定义验证函数
  25. propF:{
  26. validator:function(value){
  27. return ['success','warning','danger'].indexOf(value)!==-1
  28. }
  29. }
  30. })

prop的指定类型

type可以是下列原生构造函数中的一个:

String  Number  Boolean Array Object Date Function Symbol 还可以是自定义的构造函数

如何设置为了自定义的构造函数,可以通过instanceof来进行确认检查。还有一个其他方式我也看不懂

这里我完全不懂是如何验证的,我在网上找到了一个关于这个的代码

网上

  1. <body>
  2. <div id="app">
  3. {{myObj}}
  4. <my-component :my-obj="12"></my-component>
  5. <my-component :my-obj="myObj"></my-component>
  6. </div>
  7. <script>
  8. function MyObj(){
  9. this.name=1;
  10. this.age=2;
  11. }
  12. var myObj=new MyObj();
  13. console.log(new MyObj());
  14. Vue.component('my-component',{
  15. props:{
  16. //自定义构造器测试
  17. myObj:MyObj,
  18. },
  19. template:'<div>自定义构造器测试 ——{{myObj}}</div>'
  20. })
  21. new Vue({
  22. el:'#app',
  23. data:{
  24. myObj:myObj
  25. }
  26. })
  27. </script>
  28. </body>

 非prop的Attribute

非prop的Attribute指的是传向一个组件,但是该组件并没有对应的attribute.

不懂不写

替换、合并已有的Attribute

不懂,不写

禁用Attribute元素

如果你不希望组件的根元素继承attribute,可以在组件的选项中设置inheritAttrs:false.

inheritAttrs:false选项不会影响style和class的绑定

不懂根元素的啥继承,不写

事件名

使用小写字母横线模式 my-cute

自定义组件的v-model

model选项还可以用来避免输入框的啥子冲突喔????

后面的都看不懂,我也没法自己做出对比,自己想出。

..................

.............

..............

.............

插槽

现在插槽的语法变为v-slot指令,之前的写法可以丢了。

插槽内容

slot元素可以作为承载分发内容的出口。

插槽内可以包含任何模板代码,包括html,甚至于其他组件,但是如果使用时里面没有包含slot元素,那么等于白写了。

遇到了瓶颈 今天暂时不写了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/475178
推荐阅读
相关标签