Vue 起步(一)

举报
小米粒-biubiubiu 发表于 2020/12/02 22:59:39 2020/12/02
【摘要】                                                      Vue 起步 Vue 作为MVVM框架,极大的减少了 对 dom 元素的操作。 一、数据的双向绑定,2s之后hello vue 变为 bye vue <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <t...

                                                     Vue 起步

Vue 作为MVVM框架,极大的减少了 对 dom 元素的操作。

一、数据的双向绑定,2s之后hello vue 变为 bye vue


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">{{message}}</div>
  10. <script type="text/javascript">
  11. var app = new Vue({
  12. el: '#app',
  13. data: {
  14. message: 'hello Vue'
  15. }
  16. });
  17. setTimeout(function(){
  18. app.$data.message='bye world';
  19. },2000)
  20. </script>
  21. </body>
  22. </html>

二、利用jquery 实现传统的 todolist  demo


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>todolist jquery</title>
  6. <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <div>
  10. <input id="input" type="text" />
  11. <button id="btn">提交</button>
  12. <ul id="list"></ul>
  13. </div>
  14. <script>
  15. //m v p 设计模式,很多时候都是在操作dom,面向dom开发
  16. function Page() {
  17. }
  18. $.extend(Page.prototype, {
  19. init: function() {
  20. this.bindEvents();
  21. },
  22. bindEvents: function() {
  23. var btn = $("#btn");
  24. btn.on("click", $.proxy(this.handleBtnClick, this))
  25. },
  26. handleBtnClick: function() {
  27. //alert('123');
  28. //获取input输入框的值
  29. var input = $("#input");
  30. var inputValue = input.val();
  31. //获取ul元素
  32. var ul = $("#list");
  33. //构造li ,将li添加到ul中国
  34. ul.append("<li>" + inputValue + "</li>");
  35. input.val('');
  36. }
  37. });
  38. var page = new Page();
  39. page.init();
  40. </script>
  41. </body>
  42. </html>

三、使用vue 实现 todolist  demo


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>TodoList</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!-- v-model 双向绑定 -->
  11. <input type="text" v-model="inputValue" />
  12. <!--
  13. 作者:offline
  14. 时间:2019-03-22
  15. 描述:v-on 绑定一个事件
  16. -->
  17. <button v-on:click="handleBtnClick">提交</button>
  18. <ul>
  19. <!-- <li>第一课的内容</li>
  20. <li>第二课的内容</li>-->
  21. <!--<li v-for="item in list">{{item}}</li>-->
  22. <!--1.父组件将获取到的item和index通过v-bind的形式传递给子组件-->
  23. <!--5.父组件 通过@delete监听子组件的点击时间,监听到了子组件的点击事件之后调用父组件的
  24. handleItemDelete函数
  25. -->
  26. <todo-item v-bind:content="item" v-bind:index="index" v-for="(item,index) in list" @delete="handleItemDelete">
  27. </todo-item>
  28. </ul>
  29. </div>
  30. <script type="text/javascript">
  31. //定义全局组件
  32. // Vue.component("TodoItem",{
  33. // props:['content'],
  34. // template:"<li>{{content}}</li>"
  35. // });
  36. //局部组件
  37. var TodoItem = {
  38. //2.子组件通过props接收到父组件传来的item和index参数
  39. props: ['content', 'index'],
  40. //3.当子组件被点击的时候,触发子组件的点击事件函数
  41. template: "<li @click='handleItemClick'>{{content}}</li>",
  42. methods: {
  43. handleItemClick: function() {
  44. //4.子组件触发点击事件之后,通过emit函数通知父组件,并回传list数组的下标
  45. this.$emit("delete", this.index);
  46. }
  47. }
  48. };
  49. //mvvm 框架 数据和视图双向绑定,面向数据开发
  50. var app = new Vue({
  51. el: '#app',
  52. data: {
  53. list: ['第一课的内容', '第二课的内容', '3333'],
  54. inputValue: ''
  55. },
  56. methods: {
  57. handleBtnClick: function() {
  58. if(this.inputValue) {
  59. this.list.push(this.inputValue);
  60. this.inputValue = '';
  61. }
  62. },
  63. //6.父组件拿到子组件回传的index下标进行移除操作
  64. handleItemDelete: function(index) {
  65. this.list.splice(index, 1);
  66. }
  67. },
  68. //上面定义的局部组件需要在此将它加入到vue组件中
  69. components: {
  70. TodoItem: TodoItem
  71. }
  72. });
  73. </script>
  74. </body>
  75. </html>

 vue的每个组件其实也是vue的实例,vue的实例有很多实例属性和实例方法,在调用的时候加上$符号来区别用户自定义的属性和方法。

三、vue 的 生命周期钩子

 

 


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>vue生命周期钩子</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. </div>
  11. <script type="text/javascript">
  12. //生命周期函数就是vue实例在某一个时间节点自动执行的函数,并且vue的
  13. //生命周期函数并不放在vue实例的methods对象中。
  14. var app = new Vue({
  15. el:"#app",
  16. beforeCreate: function(){
  17. console.log(" 基础的初始化 ");
  18. },
  19. created: function(){
  20. console.log("created");
  21. },
  22. beforeMount: function(){
  23. console.log("beforeMount");
  24. },
  25. mounted: function(){
  26. console.log("mounted")
  27. },
  28. // 调用app.$destroy()方法时函数被调用
  29. beforeDestroy: function(){
  30. console.log("beforeDestroy");
  31. },
  32. destroyed: function(){
  33. console.log("destroyed");
  34. },
  35. //数据被修改的时候被调用
  36. beforeUpdate: function(){
  37. console.log("beforeUpdate");
  38. },
  39. updated:function () {
  40. console.log("updated");
  41. },
  42. template:"<div>{{test}}</div>",
  43. data:{
  44. test: "hellllllllllll......"
  45. }
  46. });
  47. setTimeout(function() {
  48. app.$data.test = 'worlddddddddd.....';
  49. },2000);
  50. // setInterval(function(){
  51. // alert('123');
  52. // },5000)
  53. </script>
  54. </body>
  55. </html>

 

四、vue的 v-text  、v-html、计算属性


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>v-text,v-html,计算属性</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div id="a">{{test+' lee'}}</div>
  11. <div id="b" v-text="test + ' lee' "></div>
  12. <div id="c" v-html="test +' lee'"></div>
  13. <div v-text="firstName"></div>
  14. <div v-html="lastName"></div>
  15. <div>计算属性:{{fullName}}</div>
  16. <!--<div>methods方法计算属性:{{fullName()}}</div>-->
  17. </div>
  18. <script type="text/javascript">
  19. var app = new Vue({
  20. el: "#app",
  21. data: {
  22. test: '<h1>dzx</h1>',
  23. firstName: "d",
  24. lastName: "zx",
  25. fullName: "dzx"
  26. },
  27. //计算属性,解决属性冗余,
  28. computed: {
  29. fullName: function() {
  30. console.log("计算 了一次");
  31. //计算属性具有缓存的作用,当计算的值被修改的时候才会重新计算。
  32. return this.firstName + " " + this.lastName;
  33. }
  34. //计算属性的get set用法
  35. // fullName:{
  36. // get:function(){
  37. // return this.firstName+" "+this.lastName;
  38. // },
  39. // set: function(value){
  40. // var arr = value.split(" ");
  41. // this.firstName = arr[0];
  42. // this.lastName = arr[1];
  43. // }
  44. // }
  45. },
  46. //普通方法
  47. // methods:{
  48. // fullName:function(){
  49. // return this.firstName+" "+this.lastName;
  50. // }
  51. // },
  52. //watch 监听 某个属性的变化,进而改变另外一个 属性的值
  53. // watch:{
  54. // firstName:function(){
  55. // this.fullName = this.firstName+" "+this.lastName;
  56. // },
  57. // lastName:function(){
  58. // this.fullName = this.firstName+" "+this.lastName;
  59. // }
  60. // }
  61. });
  62. </script>
  63. </body>
  64. </html>

 五、样式绑定


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>样式绑定</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <style type="text/css">
  8. .activated{
  9. color: red;
  10. }
  11. .activatedOne{
  12. font-size: 20px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="app">
  18. <div @click="handleDivClick" :class="{activated: isActivated}">
  19. {{msg}}
  20. </div>
  21. </div>
  22. <script type="text/javascript">
  23. var app = new Vue({
  24. el: "#app",
  25. data:{
  26. msg:"hello world",
  27. isActivated: false
  28. },
  29. methods:{
  30. handleDivClick: function () {
  31. this.isActivated = !this.isActivated;
  32. }
  33. }
  34. });
  35. </script>
  36. <div id="app1">
  37. <div @click="handleDivClick" :class="[activated,activatedOne]">
  38. {{msg}}
  39. </div>
  40. </div>
  41. <script type="text/javascript">
  42. var app1 = new Vue({
  43. el:"#app1",
  44. data:{
  45. msg:"hello world",
  46. activated:"",
  47. activatedOne: "",
  48. },
  49. methods:{
  50. handleDivClick: function () {
  51. this.activated = this.activated ==='activated'?'':'activated';
  52. this.activatedOne = this.activatedOne === 'activatedOne'?'':'activatedOne';
  53. }
  54. }
  55. })
  56. </script>
  57. <div id="app2">
  58. <div :style="[styleObj,{fontSize:'20px'}]" @click="handleDivClick">
  59. {{msg}}
  60. </div>
  61. </div>
  62. <script type="text/javascript">
  63. var app2 = new Vue({
  64. el:"#app2",
  65. data:{
  66. msg:"hello world",
  67. activated:"",
  68. activatedOne: "",
  69. styleObj:{
  70. color: "blue"
  71. }
  72. },
  73. methods:{
  74. handleDivClick:function () {
  75. this.styleObj.color = this.styleObj.color==="blue"?"red":"blue";
  76. }
  77. }
  78. })
  79. </script>
  80. </body>
  81. </html>

六、v-if 和 v-show 的使用


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>v-if,v-show</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--v-if 相当于 是对 dom元素的 删除 和 添加-->
  11. <div v-if="show">hello world</div>
  12. <!--
  13. 作者:offline
  14. 时间:2019-03-24
  15. 描述:v-if v-else-if v-else 在使用的时候一定要放在一起,中间不能有其他的元素
  16. 隔断,否则浏览器编译报错
  17. -->
  18. <div v-if="x === 'a'">this is a </div>
  19. <div v-else-if="x === 'b'">this is b</div>
  20. <div v-else>this is other</div>
  21. <!--
  22. 作者:offline
  23. 时间:2019-03-24
  24. 描述:给input 输入框添加一个唯一标识key,这样可以防止在改变show的时候
  25. 将清空之前输入框中的值
  26. -->
  27. <div v-if="show">
  28. 用户名:<input type="text" key="username"/>
  29. </div>
  30. <div v-else>
  31. 邮箱: <input type="text" key="password"/>
  32. </div>
  33. <!--
  34. 作者:offline
  35. 时间:2019-03-24
  36. 描述:v-show则是没有真正的将dom元素进行删除添加操作,仅仅只是对style样式的
  37. display属性的改变。来让dom元素实现显示和隐藏。因此在 频繁显示和隐藏的功能上
  38. 我们更加推荐使用v-show
  39. -->
  40. <div v-show="show">hello world!!</div>
  41. </div>
  42. <script type="text/javascript">
  43. var vm = new Vue({
  44. el:"#app",
  45. data:{
  46. show: false,
  47. x: "a"
  48. }
  49. });
  50. </script>
  51. </body>
  52. </html>

 七、v-for 的用法


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>v-for</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--数组的操作 push、 pop、 shift、 unshift、 splice、 sort、 reverse-->
  11. <!--当我们使用app.list[3] = {id:"004",title:"redis"} 向数组中添加元素的时候
  12. 发现页面上面不会动态 的更新,我们需要用 上面的数组操作函数才行。
  13. app.list.splice(1,1,{id:"004",title:"redis"})
  14. 或者我们直接更改整个 list的引用对象即可。
  15. -->
  16. <template v-for="(item,index) of list" :key="item.id">
  17. <div>
  18. {{item.title}}---{{index}}
  19. </div>
  20. <span>
  21. {{item.title}}
  22. </span>
  23. </template>
  24. <!--
  25. 作者:offline
  26. 时间:2019-03-24
  27. 描述:v-for 也可以用来循环遍历对象
  28. 当我们直接使用app.userInfo.address ="北京"时发现对象 确实
  29. 新增了一个address属性,但是页面上也没有动态更新显示,
  30. 我们可以直接更改 整个对象的引用地址。
  31. app.userInfo = {
  32. name:"Dell",
  33. age:28,
  34. gender:"male",
  35. address:"北京"
  36. }
  37. -->
  38. <div v-for="(item,key,index) of userInfo">
  39. {{item}}---{{key}}---{{index}}
  40. </div>
  41. <button @click="insertAddress">给用户添加一个属性</button>
  42. </div>
  43. <script type="text/javascript">
  44. var app = new Vue({
  45. el: "#app",
  46. data: {
  47. list: [{
  48. id: "001",
  49. title: "hadoop"
  50. },
  51. {
  52. id: "002",
  53. title: "spark"
  54. },
  55. {
  56. id: "003",
  57. title: "flink"
  58. }
  59. ],
  60. userInfo: {
  61. name: "Dell",
  62. age: 28,
  63. gender: "male"
  64. }
  65. },
  66. methods:{
  67. insertAddress:function(){
  68. //还有一种最简单的方式就是使用 vue 的全局set 函数直接修改或添加属性到
  69. //数组或者对象中
  70. //vue 全局set 方法
  71. Vue.set(this.userInfo,"address","北京");
  72. Vue.set(this.list,"1",{id:"0020",title:"spark0"});
  73. //vue 实例 set方法
  74. this.$set(this.userInfo,"address1","湖北");
  75. this.$set(this.list,"2",{id:"0030",title:"spark3"});
  76. }
  77. }
  78. });
  79. </script>
  80. </body>
  81. </html>

 八、组件使用细节


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件使用细节</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <table>
  11. <tbody>
  12. <!--<row></row>
  13. <row></row>
  14. <row></row>-->
  15. <!--因为在tbody中必须时tr标签,浏览器才能识别
  16. 所以我们不能直接写成定义的row组件,需要用到is属性-->
  17. <tr is="row"></tr>
  18. <tr is="row"></tr>
  19. <tr is="row"></tr>
  20. </tbody>
  21. </table>
  22. </div>
  23. <script type="text/javascript">
  24. Vue.component("row", {
  25. data: function(){
  26. return {
  27. content:"this is a row"
  28. }
  29. },
  30. template: "<tr><td>{{content}}</td></tr>"
  31. });
  32. var app = new Vue({
  33. el: "#app"
  34. });
  35. </script>
  36. <div id="app1">
  37. <!--
  38. 作者:offline
  39. 时间:2019-03-24
  40. 描述:ref的用法
  41. 1.当ref 作用在普通标签上面的时候,
  42. this.$refs.引用名称 获取到的是这个dom元素
  43. 2.当red作用在 vue组件上面的时候,
  44. this.$refs.引用名称 获取到的是组件实例的引用对象
  45. -->
  46. <div ref="my" @click="clickDiv">hello my lala lala !!!</div>
  47. <counter ref="one" @change="handleChange" ></counter>
  48. <counter ref="two" @change="handleChange" ></counter>
  49. <div>{{total}}</div>
  50. </div>
  51. <script type="text/javascript">
  52. //定义一个counter子组件
  53. Vue.component("counter",{
  54. data: function() {
  55. return {
  56. number:0
  57. }
  58. },
  59. template:"<div @click='handlerSubClick'>{{number}}</div>",
  60. methods:{
  61. handlerSubClick:function () {
  62. this.number++;
  63. this.$emit("change")
  64. }
  65. }
  66. });
  67. var app1 = new Vue({
  68. el:"#app1",
  69. data:{
  70. total:0
  71. },
  72. methods:{
  73. clickDiv: function(){
  74. alert(this.$refs.my.innerHTML);
  75. },
  76. handleChange:function () {
  77. //获取子组件的引用对象中的 number值
  78. this.total = this.$refs.one.number+this.$refs.two.number;
  79. }
  80. }
  81. });
  82. </script>
  83. </body>
  84. </html>

九、父子组件传值 


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>父子组件传值</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--
  11. 作者:offline
  12. 时间:2019-03-24
  13. 描述:父组件通过属性的形式向子组件传值
  14. ,子组件通过事件通知的形式向父组件传值
  15. -->
  16. <counter :count="3" @change="add"></counter>
  17. <counter :count="2" @change="add"></counter>
  18. <div>{{total}}</div>
  19. </div>
  20. <script type="text/javascript">
  21. var counter = {
  22. props: ['count'],
  23. data: function() {
  24. return {
  25. number: this.count
  26. }
  27. },
  28. template: "<div @click='handleClick'>{{number}}</div>",
  29. methods: {
  30. handleClick: function() {
  31. this.number += 2;
  32. this.$emit("change", 2);
  33. }
  34. }
  35. };
  36. var app = new Vue({
  37. el: "#app",
  38. components: {
  39. counter: counter
  40. },
  41. data: {
  42. total: 5
  43. },
  44. methods: {
  45. add: function(step) {
  46. this.total += step;
  47. }
  48. }
  49. });
  50. </script>
  51. </body>
  52. </html>

十、组件参数校验与非props特性

 


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件参数校验与非props特性</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <child content="hello world"></child>
  11. </div>
  12. <script type="text/javascript">
  13. Vue.component("child",{
  14. props:{
  15. //参数校验,只接受string或者number型的值
  16. content:{
  17. type:String,
  18. required:true,
  19. default:"default value", //默认值
  20. validator:function(value){ //自定义校验器
  21. return value.length>5;
  22. }
  23. }
  24. },
  25. template:"<div>{{content}}</div>"
  26. });
  27. var app = new Vue({
  28. el: "#app",
  29. data: {
  30. },
  31. methods: {
  32. }
  33. });
  34. </script>
  35. </body>
  36. </html>

 十一、给组件绑定原生事件


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件参数校验与非props特性</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--
  11. 作者:offline
  12. 时间:2019-03-24
  13. 描述:给组件 绑定原生事件,只需要加一个native 关键字即可
  14. -->
  15. <child @click.native="handleClick"></child>
  16. </div>
  17. <script type="text/javascript">
  18. Vue.component("child", {
  19. template: "<div>hello</div>"
  20. });
  21. var app = new Vue({
  22. el: "#app",
  23. data: {},
  24. methods: {
  25. handleClick: function() {
  26. alert("123");
  27. }
  28. }
  29. });
  30. </script>
  31. </body>
  32. </html>

十二、 非父子组件之间的传值

 


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>非父子组件之间的传值(Bus总线/发布订阅/观察者模式)</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <child content="Dell"></child>
  11. <child content="Lee"></child>
  12. </div>
  13. <script type="text/javascript">
  14. //使每个组件bus属性上面都挂载一个vue实例
  15. Vue.prototype.bus = new Vue();
  16. Vue.component("child", {
  17. props:{
  18. content:String
  19. },
  20. data:function(){
  21. return {
  22. selfContent:this.content
  23. }
  24. },
  25. template: "<div @click='handleClick'>{{selfContent}}</div>",
  26. methods:{
  27. handleClick:function () {
  28. //alert(this.content);
  29. this.bus.$emit('change',this.selfContent);
  30. }
  31. },
  32. mounted:function () {
  33. var this_ = this;
  34. this.bus.$on('change',function(msg){
  35. alert(msg);
  36. this_.selfContent = msg;
  37. });
  38. }
  39. });
  40. var app = new Vue({
  41. el: "#app",
  42. data: {},
  43. methods: {
  44. handleClick: function() {
  45. alert("123");
  46. }
  47. }
  48. });
  49. </script>
  50. </body>
  51. </html>

十三、在vue中使用插槽 


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <body-content>
  11. <!--
  12. 作者:offline
  13. 时间:2019-03-24
  14. 描述:组件中的dom元素就相当于插槽
  15. -->
  16. <div class="header" slot="header">header</div>
  17. <div class="footer" slot="footer">footer</div>
  18. </body-content>
  19. </div>
  20. <script type="text/javascript">
  21. Vue.component("body-content", {
  22. //通过slot标签就可以使用插槽,如果父组件中的插槽,指定了slot属性,这里使用的时候
  23. //通过slot标签的name属性就可以选择使用插槽
  24. template: `<div><slot name='header'>
  25. <h1>default value</h1>
  26. </slot>
  27. <div class='content'>content</div>
  28. <slot name='footer'></slot></div>`
  29. });
  30. var app = new Vue({
  31. el: "#app"
  32. });
  33. </script>
  34. </body>
  35. </html>

十四、 vue中的作用域插槽


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>vue中的作用域插槽</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <child>
  11. <template slot-scope="props">
  12. <h1>{{props.item}}</h1>
  13. </template>
  14. </child>
  15. <child>
  16. <template slot-scope="props">
  17. <h2>{{props.item}}</h2>
  18. </template>
  19. </child>
  20. <child>
  21. <template slot-scope="props">
  22. <h3>{{props.item}}</h3>
  23. </template>
  24. </child>
  25. </div>
  26. <script type="text/javascript">
  27. Vue.component("child", {
  28. data: function() {
  29. return {
  30. list: [1, 2, 3, 4]
  31. }
  32. },
  33. template: `<div>
  34. <ul>
  35. <slot v-for="item of list" :item=item>
  36. </ul>
  37. </div>`
  38. });
  39. var app = new Vue({
  40. el: "#app"
  41. });
  42. </script>
  43. </body>
  44. </html>

十五、动态组件与v-once指令


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--
  11. 作者:offline
  12. 时间:2019-03-24
  13. 描述:动态组件,component 标签,type是child-one 页面上
  14. 就显示child-one ,是child-two就显示child-two
  15. -->
  16. <component :is="type"></component>
  17. <!--<child-one v-if="type==='child-one'">
  18. </child-one>
  19. <child-two v-if="type==='child-two'">
  20. </child-two>-->
  21. <button @click="handleClick">change</button>
  22. </div>
  23. <script type="text/javascript">
  24. Vue.component("child-one", {
  25. // v-once使组件内容不变的情况下只加载一次,提高性能
  26. template:"<div v-once>child-one</div>"
  27. });
  28. Vue.component("child-two", {
  29. template:"<div v-once>child-two</div>"
  30. });
  31. var app = new Vue({
  32. el: "#app",
  33. data:{
  34. type:"child-one"
  35. },
  36. methods:{
  37. handleClick:function () {
  38. this.type= this.type==='child-one'?'child-two':'child-one';
  39. }
  40. }
  41. });
  42. </script>
  43. </body>
  44. </html>

 

 

 

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/88757554

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。