VUE—从入门到飞起(四)

£神魔★判官ぃ 2023-02-21 02:25 113阅读 0赞

目录

组件

组件创建方式

组件中的data和methods

组件切换方式

父组件向子组件传值

父组件把方法传递给子组件

案例:评论添加及列表显示

ref获取dom和组件


VUE—从入门到飞起(一)

VUE—从入门到飞起(二)

VUE—从入门到飞起(三)

VUE—从入门到飞起(四)

VUE—从入门到飞起(五)

组件

组件创建方式

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>创建组件1</title>
  6. <script src="../../../thirdlib/vue/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--如果要使用组件,直接把组件的名称以HTML标签的形式引入到页面中即可-->
  11. <!--驼峰样式需要将字母小写,然后用-分隔-->
  12. <my-com1></my-com1>
  13. </div>
  14. <script>
  15. //1.1使用Vue.extend来创建全局Vue组件
  16. /*var com1 = Vue.extend({
  17. //通过template属性,指定了组件要展示的html结构
  18. template: '<h3>这是用Vue.extend创建的组件</h3>'
  19. })*/
  20. //1.2使用Vue.component('组建的名称', 创建出来的组件模板对象)
  21. //Vue.component('myCom1', com1);
  22. //这里也可以不用分开
  23. Vue.component('myCom1', Vue.extend({
  24. template: '<h3>这是用Vue.extend创建的组件</h3>'
  25. }));
  26. var vm = new Vue({
  27. el:"#app",
  28. data:{
  29. },
  30. methods:{
  31. }
  32. })
  33. </script>
  34. </body>
  35. </html>
  36. <!DOCTYPE html>
  37. <html>
  38. <head>
  39. <meta charset="UTF-8">
  40. <title>创建组件2</title>
  41. <script src="../../../thirdlib/vue/vue.min.js"></script>
  42. </head>
  43. <body>
  44. <div id="app">
  45. <my-com1></my-com1>
  46. </div>
  47. <script>
  48. Vue.component('myCom1', {
  49. template:'<div><h3>这是直接使用Vue.component创建的组件</h3><span>123</span></div>'
  50. });
  51. var vm = new Vue({
  52. el:"#app",
  53. data:{
  54. },
  55. methods:{
  56. }
  57. })
  58. </script>
  59. </body>
  60. </html>
  61. <!DOCTYPE html>
  62. <html>
  63. <head>
  64. <meta charset="UTF-8">
  65. <title>用template创建组件</title>
  66. <script src="../../../thirdlib/vue/vue.min.js"></script>
  67. </head>
  68. <body>
  69. <div id="app">
  70. <my-com1></my-com1>
  71. </div>
  72. <div id="app2">
  73. <my-com2></my-com2>
  74. </div>
  75. <!--在被控制的#app外面 使用template元素,定义组件的模板元素-->
  76. <template id="tmpl">
  77. <div>
  78. <h1>这是通过template在外部定义的组件结构,这个方式有代码的提示</h1>
  79. <h4>好用</h4>
  80. </div>
  81. </template>
  82. <script>
  83. Vue.component('myCom1', {
  84. template:'#tmpl'
  85. });
  86. var vm = new Vue({
  87. el:"#app",
  88. data:{
  89. },
  90. methods:{
  91. }
  92. });
  93. var vm2 = new Vue({
  94. el:"#app2",
  95. data:{
  96. },
  97. methods:{
  98. },
  99. components:{
  100. //定义实例内部私有组件
  101. myCom2:{
  102. template:'#tmpl'
  103. }
  104. }
  105. })
  106. </script>
  107. </body>
  108. </html>

组件中的data和methods

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件中data和methods</title>
  6. <script src="../../../thirdlib/vue/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <mycom1></mycom1>
  11. <hr />
  12. <mycom1></mycom1>
  13. <hr />
  14. <mycom1></mycom1>
  15. <hr />
  16. </div>
  17. <template id="temp">
  18. <div>
  19. <input type="button" value="+1" @click="add" />
  20. <h3>{
  21. { count }}</h3>
  22. </div>
  23. </template>
  24. <script>
  25. //1.组件可以有自己的data数据,
  26. //2.组件的data和实例的data不一样。实例 的data是一个对象;组件中的data是一个function,并且return一个对象。
  27. //3.组件中的data和实例中的data使用方式完全一样
  28. Vue.component('mycom1', {
  29. template:'#temp',
  30. data:function(){
  31. return {
  32. count:0
  33. }
  34. },
  35. methods:{
  36. add(){
  37. this.count ++;
  38. }
  39. }
  40. });
  41. var vm = new Vue({
  42. el:"#app",
  43. data:{
  44. },
  45. methods:{
  46. }
  47. })
  48. </script>
  49. </body>
  50. </html>

组件切换方式

  1. <div id="app">
  2. <a @click.prevent="flag = true" href="">登录</a>
  3. <a @click.prevent="flag = false" href="">注册</a>
  4. <login v-if="flag"></login>
  5. <regest v-else></regest>
  6. </div>
  7. <script>
  8. Vue.component('login', {
  9. template:'<h3>登录组件</h3>'
  10. });
  11. Vue.component('regest', {
  12. template:'<h3>注册组件</h3>'
  13. });
  14. var vm = new Vue({
  15. el:"#app",
  16. data:{
  17. flag:false
  18. },
  19. methods:{
  20. }
  21. })
  22. </script>
  23. <div id="app">
  24. <a @click.prevent="flag = 'login'" href="">登录</a>
  25. <a @click.prevent="flag = 'regest'" href="">注册</a>
  26. <!--Vue提供了component, 来展示对应名称的组件-->
  27. <!--component是一个 占位符 ,:is属性 , 可以用来指定要展示的组件名称-->
  28. <component :is="flag"></component>
  29. </div>
  30. <script>
  31. //组件名称是字符串
  32. Vue.component('login', {
  33. template:'<h3>登录组件</h3>'
  34. });
  35. Vue.component('regest', {
  36. template:'<h3>注册组件</h3>'
  37. });
  38. var vm = new Vue({
  39. el:"#app",
  40. data:{
  41. flag:'login'
  42. },
  43. methods:{
  44. }
  45. })
  46. </script>
  47. <!DOCTYPE html>
  48. <html>
  49. <head>
  50. <meta charset="UTF-8">
  51. <title>组件切换动画</title>
  52. <script src="../../../thirdlib/vue/vue.min.js"></script>
  53. <style>
  54. .v-enter,
  55. .v-leave-to {
  56. opacity: 0;
  57. transform: translateX(150px);
  58. }
  59. .v-enter-active,
  60. .v-leave-active {
  61. transition: all 0.5s ease;
  62. }
  63. </style>
  64. </head>
  65. <body>
  66. <div id="app">
  67. <a @click.prevent="flag = 'login'" href="">登录</a>
  68. <a @click.prevent="flag = 'regest'" href="">注册</a>
  69. <!--Vue提供了component, 来展示对应名称的组件-->
  70. <!--component是一个 占位符 ,:is属性 , 可以用来指定要展示的组件名称-->
  71. <!--通过mode属性设置组件切换时候的 方式-->
  72. <transition mode="out-in">
  73. <component :is="flag"></component>
  74. </transition>
  75. </div>
  76. <script>
  77. //组件名称是字符串
  78. Vue.component('login', {
  79. template:'<h3>登录组件</h3>'
  80. });
  81. Vue.component('regest', {
  82. template:'<h3>注册组件</h3>'
  83. });
  84. var vm = new Vue({
  85. el:"#app",
  86. data:{
  87. flag:'login'
  88. },
  89. methods:{
  90. }
  91. })
  92. </script>
  93. </body>
  94. </html>

父组件向子组件传值

  1. <div id="app">
  2. <!--父组件可以在引用子组件的时候,通过自定义属性绑定的形式v-bind将数据传递到子组件-->
  3. <com1 v-bind:parentmsg="msg"></com1>
  4. </div>
  5. <script>
  6. var vm = new Vue({
  7. el:"#app",
  8. data:{
  9. msg:"123 父组件中的数据"
  10. },
  11. methods:{},
  12. components:{
  13. com1:{
  14. //结论:子组件中默认无法访问到父组件中data中的数据和methods中的方法
  15. template:"<h1 @click='change'>处理这是子组件---{
  16. { parentmsg }}</h1>",
  17. //data数据并不是父组件传递过来的,而是自身私有的
  18. //比如,组件通过ajax请求的数据,都可以放在data身上
  19. //data中的数据,都是可读可写的,props中的数据都是只读的
  20. data:function(){
  21. return {
  22. title:"123",
  23. content:"111"
  24. }
  25. },
  26. //组件中的所有props中的数据,都是通过父组件传递给子组件的
  27. props : [//把父组件传递过来的parentmsg,在props中定义一下,这样才能使用这个数据
  28. 'parentmsg'
  29. ],
  30. methods:{
  31. change(){
  32. }
  33. }
  34. }
  35. }
  36. })
  37. </script>

父组件把方法传递给子组件

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>父组件把方法传递给子组件</title>
  6. <script src="../../../thirdlib/vue/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. {
  11. { msg }}
  12. <!--父组件向子组件传递方法使用的是 事件绑定机制v-on-->
  13. <!--这里不用带括号,直接将方法的引用传给子组件-->
  14. <com2 v-on:func="show"></com2>
  15. </div>
  16. <template id="temp">
  17. <div>
  18. <h1>这是子组件</h1>
  19. <input type="button" @click="myclick" value="父组件传递的func方法"/>
  20. </div>
  21. </template>
  22. <script>
  23. var com2 = {
  24. template:'#temp',
  25. data(){
  26. return {
  27. sonmsg:{name:'小头儿子', age:6}
  28. }
  29. },
  30. methods:{
  31. myclick(){
  32. //如何拿到父组件的show方法,拿到func方法
  33. //emit 英文原意 : 是触发、调用的意思
  34. //参数依次写在后面
  35. this.$emit('func', this.sonmsg, 321);
  36. }
  37. }
  38. }
  39. var vm = new Vue({
  40. el:"#app",
  41. data:{
  42. msg : null
  43. },
  44. methods:{
  45. show(data, data2){
  46. this.msg = data;
  47. console.log('调用了父组件身上的show方法:' + data + data2);
  48. }
  49. },
  50. components:{
  51. com2:com2
  52. }
  53. })
  54. </script>
  55. </body>
  56. </html>

案例:评论添加及列表显示

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>评论列表</title>
  6. <script src="../../../thirdlib/vue/vue.js"></script>
  7. <link rel="stylesheet" href="../../../thirdlib/css/bootstrap.min.css" />
  8. </head>
  9. <body>
  10. <div id="app">
  11. <cmtbox @fresh="loadComments" @test="test"></cmtbox>
  12. <ul class="list-group">
  13. <li v-for="item in list" :key="item.id" class="list-group-item">
  14. <span class="badge">{
  15. { item.user }}</span>
  16. {
  17. { item.content}}
  18. </li>
  19. </ul>
  20. </div>
  21. <template id="tmpl">
  22. <div>
  23. <div class="form-group">
  24. <label>评论人:</label>
  25. <input v-model="user" type="text" class="form-control" />
  26. </div>
  27. <div class="form-group">
  28. <label>评论内容:</label>
  29. <textarea v-model="content" class="form-control"></textarea>
  30. </div>
  31. <div class="form-group">
  32. <input @click="add" type="button" value="发表评论" class="btn btn-primary" />
  33. </div>
  34. </div>
  35. </template>
  36. <script>
  37. var commentBox = {
  38. template : "#tmpl",
  39. data(){
  40. return {
  41. user:"",
  42. content:""
  43. }
  44. },
  45. methods:{
  46. add(){
  47. var comment = {id:Date.now(), user : this.user, content:this.content};
  48. //从localstorage获取所有评论
  49. var list = JSON.parse(localStorage.getItem('cmts') || '[]');
  50. list.push(comment);
  51. //保存最新的评论数据
  52. localStorage.setItem('cmts', JSON.stringify(list));
  53. this.user = this.content = "";
  54. //触发父组件的刷新数据方法
  55. //可以同时绑定多个父组件方法
  56. this.$emit('fresh');
  57. this.$emit('test');
  58. }
  59. }
  60. }
  61. var vm = new Vue({
  62. el:"#app",
  63. data:{
  64. list:[
  65. {id:Date.now(), user:'李白', content:'天生我材必有用'},
  66. {id:Date.now(), user:'白居易', content:'蜀道之难'},
  67. {id:Date.now(), user:'江小白', content:'劝君更尽一杯酒'}
  68. ]
  69. },
  70. methods:{
  71. loadComments(){
  72. //从本地localStorage中加载评论
  73. var locallist = JSON.parse(localStorage.getItem('cmts') || '[]');
  74. this.list = locallist;
  75. },
  76. test(){
  77. console.log("ok");
  78. }
  79. },
  80. components:{//组件
  81. cmtbox:commentBox
  82. },
  83. created(){
  84. this.loadComments();
  85. }
  86. })
  87. </script>
  88. </body>
  89. </html>

ref获取dom和组件

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ref获取dom和组件</title>
  6. <script src="../../../thirdlib/vue/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <input type="button" ref="btn" value="获取元素" @click="getele" />
  11. <h3 ref="myh3">哈哈哈</h3>
  12. <hr />
  13. <login ref="mylogin"></login>
  14. </div>
  15. <script>
  16. var login = {
  17. template:'<h1>登录组件</h1>',
  18. data(){
  19. return {
  20. msg:"组件msg"
  21. }
  22. },
  23. methods:{
  24. show(){
  25. console.log("调用子组件的方法");
  26. }
  27. }
  28. }
  29. var vm = new Vue({
  30. el:"#app",
  31. data:{
  32. },
  33. methods:{
  34. getele(){
  35. //ref 是 reference 引用
  36. //console.log(this.$refs.myh3.innerText);
  37. console.log(this.$refs.mylogin.msg);
  38. this.$refs.mylogin.show();
  39. }
  40. },
  41. components:{
  42. login : login
  43. }
  44. })
  45. </script>
  46. </body>
  47. </html>

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读