经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
【Vue】计算属性 监听属性 组件通信 动态组件 插槽 vue-cli脚手架
来源:cnblogs  作者:passion2021  时间:2023/2/17 16:48:20  对本文有异议

昨日回顾

  1. # 1 checkbox v-model 只针对于input,做双向数据绑定
  2. -单选 :选中或不选中 选中就是true,不选中就是false
  3. -多选 :数组,选了多个,把选中的value值放到数组中
  4. # 2 购物车案例
  5. -checkbox 多选
  6. -插值 可以放 函数() 把函数返回结果放在插值中
  7. -插值中的东西,只要变量发生变化,就会重新刷新
  8. getprice 使用了 checkbox的数组----》只要数组发生变化,getprice就会重新运算,刷新页面
  9. # 2.1 全选全不选
  10. -全选的checkbox----》checkbox单选---》布尔类型----》每次变化都会触发handleCheckAll的执行
  11. -只要是true,就把 this.checkGroup = this.goodList
  12. -只要是false,把this.checkGroup = []
  13. -下面的每个checkbox----》checkbox多选---》数组类型----》每次变化触发handelCheckOne
  14. -每次都要判断this.checkGroup长度和this.goodList长度是否一样,如果一样说明全选了,全选了就把checkAll 设置为true
  15. -否则,就是false
  16. # 2.2 购物车带加减
  17. -加----》绑定点击事件,自增1
  18. -减-----》函数判断,不能小于1 ,如果小于1 ,不让减了,做提示
  19. # 3 v-model进阶 修饰v-model
  20. -lazy
  21. -number
  22. -trim
  23. # 4 vue的声明周期
  24. -8个生命周期钩子函数
  25. -createdajax请求放在这里
  26. -destory:销毁,定时任务,清理掉
  27. -延迟任务,定时任务
  28. -实时跟后端交互
  29. -秒杀场景
  30. -实时监控你服务器cpu的占用率
  31. -折线图:psutilcpu核心数,占用率,内存使用率,某个盘符使用率 /user
  32. -echarts
  33. # 5 与后端交互
  34. -js原生发送ajax请求
  35. -jqajax
  36. -fetch方案
  37. -axios 封装了原生的ajax
  38. -跨域问题:浏览器的安全策略,不允许向不同域发送请求,获取数据
  39. -axios.get('地址').then(res=>{
  40. res 对象, res.data 响应体的数据
  41. })
  42. # 6 如何实现服务端主动推送消息效果[在线聊天室]
  43. -http 轮询 长轮询 websocket-不是所有浏览器都兼容
  44. # 7 组件 组件化开发
  45. -全局组件
  46. Vue.component('名字',{template,data(){return {}},methods,生命周期})
  47. -局部组件(只能用在当前组件中) 以后咱们用局部组件用的多
  48. components: {
  49. foo:{}
  50. }

1 计算属性

  1. # 插值语法写函数 --> {{ 函数() }}
  2. 如果 {{函数()}} ,每次页面刷新,函数都会重新执行
  3. 函数---》当属性来使用,缓存
  4. # 计算属性
  5. 计算属性只有使用的变量发生变化时,才重新运算
  6. 计算属性就像Python中的property,可以把方法/函数伪装成属性

插值语法+函数

需求:写一个输入框,输入框右侧即时显示用户输入的内容,如果用户输入的是英文字母(假设用户只输入英文),将输入的第一个英文字母大写。

image-20230216222335567

插值语法放入一个函数时{{函数()}},每次页面刷新,函数都会重新执行。
可能出现一种情况,比如只是刷新了页面的某一个部分,此时不想让函数重新计算。由于函数这种自动更新不是我们想要的,所以需要使用:计算属性。也就是把函数当作属性来使用,并且视情况来决定是否需要更新。

image-20230216221737177

截取到字符串0到1位置的字符:slice(0,1),并且将其转大写:toUpperCase()

示例:

image-20230216222145829

slice(1):从第二个字符切到最后一个字符

实现首字母大写功能:

image-20230216222335567

我们再写一个输入框:

image-20230216222423032

问题在于,我们在这第二个输入框进行操作时,函数handleUpper()会一直执行,这是很消耗资源的(每次输入函数都会执行):

也就是只要页面刷新,无论跟它有没有关系,都会执行。

image-20230216222726801

使用计算属性

在配置项computed里面写函数,这些函数会当属性使用。注意这些函数都需要有return值。

image-20230216222844229

使用计算属性的时候无需加括号:

image-20230216222932768

只有计算属性使用的变量发生变化时,计算属性才会发生变化。并且将计算属性当作属性用即可。可以使用for循环。

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <!-- <h1>input输入单词,首字母转成大写展示</h1>-->
  11. <!-- <input type="text" v-model="mytext">&#45;&#45;&ndash;&gt;{{mytext.slice(0, 1).toUpperCase() + mytext.slice(1)}}-->
  12. <h1>input输入单词,首字母转成大写展示---函数方式---》只要页面刷新,无论跟它有没有关,都会重新运算</h1>
  13. <!-- <input type="text" v-model="mytext">&#45;&#45;&ndash;&gt;{{getUpper()}}-->
  14. <input type="text" v-model="mytext">---->{{newText}}
  15. <br>
  16. <input type="text" v-model="age">--->{{age}}
  17. </div>
  18. </body>
  19. <script>
  20. var vm = new Vue({
  21. el: '.app',
  22. data: {
  23. mytext: '',
  24. age: 10
  25. },
  26. methods: {
  27. getUpper() {
  28. console.log('函数---我执行了')
  29. return this.mytext.slice(0, 1).toUpperCase() + this.mytext.slice(1)
  30. }
  31. },
  32. // 计算属性---->computed 里面写方法,以后,方法当属性用 ,一定要有return值
  33. computed: {
  34. newText() {
  35. console.log('计算属性---我执行了')
  36. return this.mytext.slice(0, 1).toUpperCase() + this.mytext.slice(1)
  37. }
  38. }
  39. })
  40. </script>
  41. </html>

计算属性重写过滤案例

示例;

image-20230217120522668

示例:

image-20230217120535357

计算属性中使用了mytext,因为mytext变化了,所以计算属性会刷新。并且因为是计算属性,所以可以使用v-for循环。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div>
  10. <div class="app">
  11. <h1>过滤案例</h1>
  12. <p>请输入要搜索的内容:<input type="text" v-model="myText"></p>
  13. <ul>
  14. <li v-for="item in newDateList">{{item}}</li>
  15. </ul>
  16. </div>
  17. </div>
  18. </body>
  19. <script>
  20. var vm = new Vue({
  21. el: '.app',
  22. data: {
  23. myText: '',
  24. dataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
  25. },
  26. computed: {
  27. newDateList() {
  28. return this.dataList.filter(
  29. item => item.indexOf(this.myText) >= 0
  30. )
  31. }
  32. }
  33. })
  34. </script>
  35. </html>

2 监听属性

  1. # 在 data 中定义了一些变量,只要变量发生变化,我们就执行一个函数
  2. watch:{
  3. 属性名(){
  4. }
  5. }

监听属性的用途:

image-20230217120846860

点击按钮对商品排序。
有个属性叫sorting,如果点击按钮这个属性就会变化:

image-20230217121048421

这个属性变化,就向后端发送ajax请求获取数据。

示例:

image-20230217121201865

image-20230217121318765

image-20230217121359499

image-20230217121502545

监听course_type,重新显示页面。

发送请求:

image-20230217121553468

设置监听属性:

image-20230217121742349

不用传入course_type,因为全局的course_type已经被修改了。
监听属性不用return值。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div>
  10. <div class="app">
  11. <!-- <span @click="handleClick(1)">Python</span>| <span @click="handleClick(2)">Linux</span>-->
  12. <span @click="course_type=1">Python</span>| <span @click="course_type=2">Linux</span>
  13. <div>
  14. 假设有很多课程,点击上面的标签可以完成过滤
  15. </div>
  16. </div>
  17. </div>
  18. </body>
  19. <script>
  20. var vm = new Vue({
  21. el: '.app',
  22. data: {
  23. course_type: '0'
  24. },
  25. created() {
  26. this.getData()
  27. },
  28. methods: {
  29. getData() {
  30. // 发送ajax ,获取所有课程,通过course过滤
  31. // http://127.0.0.1:8080/api/v1/courses?course_type=0
  32. },
  33. // handleClick(type){
  34. // this.course_type=type
  35. // this.getData()
  36. // }
  37. },
  38. watch: {
  39. course_type() {
  40. console.log('我变化了')
  41. this.getData()
  42. }
  43. }
  44. })
  45. </script>
  46. </html>

3 组件介绍和定义

  1. # 扩展 HTML 元素,封装可重用的代码,目的是复用
  2. -例如:有一个轮播,可以在很多页面中使用,一个轮播有jscsshtml
  3. -组件把jscsshtml放到一起,有逻辑,有样式,有html
  4. # 定义组件 ()
  5. -全局组件:全局可以使用,可以用在任意其它组件中
  6. -局部组件:局部组件只能在定义的位置(组件中)使用
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1>全局组件</h1>
  11. <child></child>
  12. <hr>
  13. 局部组件
  14. <lqz></lqz>
  15. <hr>
  16. </div>
  17. </body>
  18. <script>
  19. // 1 定义全局组件 (必须在一个标签),组件有自己的数据,方法,生周期.....
  20. var obj = {
  21. template: `
  22. <div>
  23. <button>后退</button>
  24. {{ title }}
  25. <button @click="handleClick">前进</button>
  26. </div>`,
  27. data() {
  28. return {
  29. title: '标题'
  30. }
  31. },
  32. methods: {
  33. handleClick() {
  34. alert('前进')
  35. }
  36. },
  37. }
  38. Vue.component('child', obj)
  39. //2 局部组件
  40. var lqz = {
  41. template: `
  42. <div>
  43. <h1>我是lqz组件</h1>
  44. {{ name }}
  45. <child3></child3>
  46. <child></child>
  47. </div>`,
  48. data() {
  49. return {
  50. name: 'lqz'
  51. }
  52. },
  53. components: {
  54. 'child3': {
  55. template: `
  56. <div>
  57. <h2>我是lqz组件内的组件</h2>
  58. </div>`,
  59. }
  60. }
  61. }
  62. var vm = new Vue({
  63. el: '#app',
  64. data: {},
  65. components: {
  66. lqz
  67. }
  68. })
  69. </script>
  70. </html>

组件之间数据隔离

  1. # 根组件 和 组件 注意事项
  2. -new Vew()---->管理div----》根组件
  3. -自己再定义的全局组件,局部组件都是不同组件,不是根组价
  4. -组件有自己的htmlcssjs ---》数据,事件,。。。。。
  5. -在组件中,this代指当前组件
  6. -父子组件的data是无法共享的
  7. -data1个函数,需要有返回值(return)

组件之中父子之间的data是无法共享的:

image-20230217093341619

这个name是子组件的数据。故此数据无法通过插值语法显示。

局部组件的情况:

image-20230217093450725

局部组件有name这个属性,但是根组件无法之间使用。

总结:

  • 父子组件的data相互隔离的。
  • 就算父子的data中数据相同,拥有相同的方法,也是互不影响的.

4 组件通信

父子通信之父传子

  1. # 组件间数据不共享 ----> 需要进行数据传递
  2. # 父传子:使用自定义属性方式

父传子:使用自定义属性的方式传递数据

image-20230217100432762

child标签内,写一个自定义属性myage。(注意上图不能属性使用驼峰体,否则会报错)

子组件怎么接受父组件的数据?
使用props配置项。

image-20230217100832327

在子组件的配置项props写一个列表,列表里面放着自定义属性的名字myage。这样在子组件的template就可以通过插值语法来获取myage里携带的数据。

自定义属性不能使用驼峰体:

image-20230217101826000

自定义属性的区别:

image-20230217101227278

示例:

image-20230217101249814

  • :age="19"给子组件传递了一个数字19
  • age="19"给子组件传递了一个字符串19

属性验证:

子组件使用props接受的时候可以进行属性验证:

image-20230217101609129

如果传入的数据类型不是我们指定的数据类型,前端页面还是会将其渲染,但是控制台会报错:

image-20230217101555412

遇到变量名相同的情况,子组件优先用哪个数据?

image-20230217101916311

会使用父组件传来的数据,但是控制台会报错。所以传自定义属性的时候,不要跟子组件中变量冲突。

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <h1>父子通信之父传子,通过自定义属性--->不能用驼峰,不要跟子组件中变量冲突</h1>
  11. <!-- <h2>字符串的age&ndash;&gt;age="age"</h2>-->
  12. <!-- <child age="age"></child>-->
  13. <!-- <h2>:age="19"</h2>-->
  14. <!-- <child :age="19"></child>-->
  15. <!-- <h2>age="19"</h2>-->
  16. <!-- <child age="19"></child>-->
  17. <!-- <h2>:age="age"</h2>-->
  18. <child :age="age" myname="彭于晏"></child>
  19. <h1>属性验证---》传入的必须是xx类型</h1>
  20. <!-- <h2>字符串的age&ndash;&gt;age="age"</h2>-->
  21. <!-- <child age="age"></child>-->
  22. <!-- <h2>:age="19"</h2>-->
  23. <!-- <child :age="19"></child>-->
  24. <!-- <h2>age="19"</h2>-->
  25. <!-- <child age="19"></child>-->
  26. <!-- <h2>:age="age"</h2>-->
  27. <!-- <child :age="age"></child>-->
  28. </div>
  29. </body>
  30. <script>
  31. // 父中有age,子child 只有name,没有age,现在把父中的age传到child中,显示
  32. var child = {
  33. template: `
  34. <div>
  35. <button>后退</button>
  36. 首页--->名字:{{ myname }}--->年龄:{{ age }}
  37. <button>前进</button>
  38. </div>`,
  39. data() {
  40. return {
  41. myname: 'lqz'
  42. }
  43. },
  44. // props: ['age'],
  45. props: {age: Number, myname: String},
  46. }
  47. var vm = new Vue({
  48. el: '.app',
  49. data: {
  50. age: 19
  51. },
  52. components: {
  53. child
  54. }
  55. })
  56. </script>
  57. </html>

父子通信之子传父

  1. # 通过自定义事件

image-20230217103331749

需求:

image-20230217102230709

点击子组件按钮,将子组件输入框数据传递给父组件显示。

定义子组件:

image-20230217102344926

在父组件使用子组件传递的数据:

image-20230217102539241

通过自定义事件实现子传父,父组件里写函数handleEvent函数,child标签里写自定义事件@myevent

image-20230217102726725

通过传参的方式传递给父组件。

子组件使用this.$emit('事件名',传递的数据对象)触发,child中事件@myevent

image-20230217102919952

事件被触发,父组件函数handleEvent执行,此时函数的形参mytext可以获取到子组件传来的数据,通过数据修改父组件的属性:

image-20230217102726725

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <p>子组件传递过来的数据: {{mytext}}</p>
  11. <hr>
  12. <child @myevent="handleEvent"></child>
  13. <hr>
  14. </div>
  15. </body>
  16. <script>
  17. var child = {
  18. template: `
  19. <div>
  20. <input type="text" v-model="mytext">
  21. <button @click="handleSend">点我传递</button>
  22. </div>`,
  23. data() {
  24. return {
  25. mytext: ''
  26. }
  27. },
  28. methods: {
  29. handleSend() {
  30. // alert(this.mytext)
  31. // 子组件中,触发自定义事件的执行,会执行父组件自定义事件绑定的函数,有几个参数,就传几个参数
  32. this.$emit('myevent', this.mytext)
  33. }
  34. }
  35. }
  36. var vm = new Vue({
  37. el: '.app',
  38. data: {
  39. mytext: ''
  40. },
  41. methods: {
  42. handleEvent(mytext) {
  43. this.mytext = mytext
  44. }
  45. },
  46. components: {
  47. child
  48. }
  49. })
  50. </script>
  51. </html>

ref属性

  1. # 自定义属性和自定义事件 可以实现父子传值
  2. # ref属性 可以更方便的实现父子通信
  3. # ref属性放在普通标签上 <input type="text" ref="myinput">
  4. -可以放在普通标签上,通过this.$refs.自定义的名字取到的是 原生的dom对象 ---> 可以进行原生dom操作了(不推荐)
  5. # ref属性放在组件上 <child ref="mychild"></child>
  6. -可以放在组件上:通过this.$refs.自定义的名字取到的是 vc对象(组件对象),既然拿到了组件对象,组件对象中的 变量,方法,都能直接通过 . 的方式调用
  7. -可以之间使用组件对象上的方法和属性 ---> 子的数据给了父亲
  8. -父组件有个方法执行,需要传参数,传入子组件的数据 ---> 子的数据给了父亲
  9. -拿到子对象之间使用父中的数据修改 ---> 父传子
  10. -因此不需要关注是子传父,还是父传子,直接通过组件对象,使用即可

准备:

image-20230217103911309

$前缀防止数据污染:数据被覆盖。

image-20230217103833317

获取到的是:

image-20230217104009837

可以获取到原生的html.

image-20230217104330846

可以放在普通标签上,通过this.$refs.自定义的名字取到的是 原生的dom对象

查看Vue对象:

image-20230217104049118

如果不定义ref属性:

image-20230217104126494

可以进行dom操作:

image-20230217104425571

使用原生dom操作了(不推荐)

ref属性可以放在组件上:
通过this.$refs.自定义的名字取到的是 vc对象(组件对象)

示例:

image-20230217104737812

父组件注册:

image-20230217104851543

父组件添加ref属性:

image-20230217105435220

查看函数:

image-20230217104905104

前端:

image-20230217104919622

实现子传父:

image-20230217105139732

以后不需要关注是子传父还是父传子。直接通过对象取值赋值即可。

并且可以父组件主动使用子组件的函数:

image-20230217105416479

扩展

image-20230217095953794

通常组件之间通信只能通过一层一层的传到父组件,再由父组件一层层传递数据给子组件,来实现跨组件传递。
这样十分麻烦。
所以可以使用Vuex状态管理器、cookies,这两种方式都相当于将数据存储在一个指定的位置,组件都可以去这个地方获取数据。

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <button @click="handleClick">点我</button>
  11. ----》{{age}}
  12. <br>
  13. <input type="text" ref="myinput">
  14. <div ref="mydiv">我是div</div>
  15. <hr>
  16. <child ref="mychild"></child>
  17. <hr>
  18. </div>
  19. </body>
  20. <script>
  21. // 父中有age,子child 只有name,没有age,现在把父中的age传到child中,显示
  22. var child = {
  23. template: `
  24. <div>
  25. <h1>名字:{{ name }}--->年龄:{{ age }}</h1>
  26. <button @click="handleClick">点我弹出名字</button>
  27. </div>`,
  28. data() {
  29. return {
  30. name: 'lqz',
  31. age: 19
  32. }
  33. },
  34. methods: {
  35. handleClick() {
  36. alert(this.name)
  37. }
  38. }
  39. }
  40. var vm = new Vue({
  41. el: '.app',
  42. data: {
  43. age: 999,
  44. },
  45. methods: {
  46. handleClick() {
  47. // 1 ref 属性放在普通标签上,拿到标签的dom对象
  48. // 通过this.$refs可以拿到所有标签上写了ref属性的 标签 ,对象类型 key值是ref对应的value值, value值是原生dom对象
  49. // console.log(this.$refs)
  50. // 直接修改原生dom对象的value属性,input就能看到有值了
  51. // this.$refs.myinput.value = 'lqz is handsome'
  52. //2 ref 属性放在 组件上,拿到的是 组件对象 ,就可以使用组件对象的属性和方法
  53. // console.log(this.$refs) // 对象中有3个值,两个普通标签,一个组件
  54. // this.$refs.mychild 就是组件对象,可以 .属性, .方法
  55. // this.age = this.$refs.mychild.age
  56. // 重点:以后就不需要关注是子传父还是父传子了,直接通过对象取值赋值即可,而且可以主动调用子组件中的函数
  57. this.$refs.mychild.handleClick()
  58. }
  59. },
  60. components: {
  61. child
  62. }
  63. })
  64. </script>
  65. </html>

5 动态组件

  1. # 动态组件
  2. # 小案例:点击不同标签,显示不同组件

组件切换:

image-20230217105813052

通过v-if显示组件切换

定义组件:

image-20230217110011484

使用组件:

image-20230217110128658

添加click事件:

image-20230217110204736

设置默认页面:

image-20230217110338545

使用点击函数、data属性控制显示哪个组件:

image-20230217110353921

使用elementui:

image-20230217110535637

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <span @click="handleClick('home')">首页</span>| <span @click="handleClick('order')">订单</span> | <span
  11. @click="handleClick('goods')">商品</span>
  12. <home v-if="chooseType=='home'"></home>
  13. <order v-else-if="chooseType=='order'"></order>
  14. <goods v-else></goods>
  15. </div>
  16. </body>
  17. <script>
  18. var home = {
  19. template: `
  20. <div>
  21. <h1>home页面</h1>
  22. </div>`,
  23. }
  24. var order = {
  25. template: `
  26. <div>
  27. <h1>order页面</h1>
  28. </div>`,
  29. }
  30. var goods = {
  31. template: `
  32. <div>
  33. <h1>商品页面</h1>
  34. </div>`,
  35. }
  36. var vm = new Vue({
  37. el: '.app',
  38. data: {
  39. chooseType: 'home'
  40. },
  41. methods: {
  42. handleClick(type) {
  43. this.chooseType = type
  44. }
  45. },
  46. components: {
  47. home,
  48. order, goods
  49. }
  50. })
  51. </script>
  52. </html>

动态组件component标签

必须使用Vue提供的componment标签,这个标签有个is属性。
is属性写哪个自定义组件的名字这个componment标签就显示哪个组件。

注意:
这个组件必须要在父组件的componments属性中注册,写这个组件的名字才会显示。

image-20230217110645716

也就是is对应哪个字符串,就显示哪个组件。

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <span @click="handleClick('home')">首页</span>| <span @click="handleClick('order')">订单</span> | <span
  11. @click="handleClick('goods')">商品</span>
  12. <component :is="who"></component>
  13. </div>
  14. </body>
  15. <script>
  16. var home = {
  17. template: `
  18. <div>
  19. <h1>home页面</h1>
  20. </div>`,
  21. }
  22. var order = {
  23. template: `
  24. <div>
  25. <h1>order页面</h1>
  26. </div>`,
  27. }
  28. var goods = {
  29. template: `
  30. <div>
  31. <h1>商品页面</h1>
  32. </div>`,
  33. }
  34. var vm = new Vue({
  35. el: '.app',
  36. data: {
  37. who: 'home'
  38. },
  39. methods: {
  40. handleClick(type) {
  41. this.who = type
  42. }
  43. },
  44. components: {
  45. home,
  46. order, goods
  47. }
  48. })
  49. </script>
  50. </html>

keep-alive保持组件不销毁

使用动态组件,当切换组件的时候,再切换回来的时候,前一个组件输入的信息会被消毁。所以需要使用keep-alive标签包一下:

image-20230217113928975

相当于做了一层缓存。保持组件不被销毁。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <span @click="handleClick('home')">首页</span>| <span @click="handleClick('order')">订单</span> | <span
  11. @click="handleClick('goods')">商品</span>
  12. <keep-alive>
  13. <component :is="who"></component>
  14. </keep-alive>
  15. </div>
  16. </body>
  17. <script>
  18. var home = {
  19. template: `
  20. <div>
  21. <h1>home页面</h1>
  22. </div>`,
  23. }
  24. var order = {
  25. template: `
  26. <div>
  27. <h1>order页面</h1>
  28. </div>`,
  29. }
  30. var goods = {
  31. template: `
  32. <div>
  33. <h1>商品页面</h1>
  34. <input type="text" > <buttont>搜索</buttont>
  35. </div>`,
  36. }
  37. var vm = new Vue({
  38. el: '.app',
  39. data: {
  40. who: 'home'
  41. },
  42. methods: {
  43. handleClick(type) {
  44. this.who = type
  45. }
  46. },
  47. components: {
  48. home,
  49. order, goods
  50. }
  51. })
  52. </script>
  53. </html>

6 插槽

  1. # 插槽出现的原因
  2. 一般情况下,编写完1个组件之后,组件的内容都是写死的,需要加数据 只能去组件中修改,扩展性很差,然后就出现了插槽这个概念。
  3. # 插槽的使用
  4. 只需在组件中添加<slot></slot>,就可以在body的组件标签中添加内容

匿名插槽

示例:

image-20230217114144789

填充插槽:

在父组件监控代码内的子组件标签之间写的内容,会原封不动的替换到子组件的slot标签中。

比如子组件的标签是<home><home>标签内的所有内容会替换到子组件的shot标签。

image-20230217163615171

如果有多个插槽,所有插槽都会被替换:

image-20230217114529380

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <hr>
  11. <home>
  12. <div>
  13. <img src="./img.png" alt="">
  14. </div>
  15. </home>
  16. <hr>
  17. </div>
  18. </body>
  19. <script>
  20. var home = {
  21. template: `
  22. <div>
  23. <h1>home页面</h1>
  24. <slot></slot>
  25. <h1>结束了</h1>
  26. </div>`,
  27. }
  28. var vm = new Vue({
  29. el: '.app',
  30. data: {},
  31. components: {
  32. home,
  33. }
  34. })
  35. </script>
  36. </html>

具名插槽

在子组件中写插槽的名字,使用name属性:

image-20230217114620613

在父组件指定替换哪个插槽,使用slot属性:

image-20230217114639539

使用slot属性,将这个div替换到子组件name="a"的插槽上。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <hr>
  11. <home>
  12. <div slot="a">
  13. <img src="./img.png" alt="">
  14. </div>
  15. <div slot="b">
  16. 我是div
  17. </div>
  18. </home>
  19. <hr>
  20. </div>
  21. </body>
  22. <script>
  23. var home = {
  24. template: `
  25. <div>
  26. <h1>home页面</h1>
  27. <slot name="a"></slot>
  28. <h1>结束了</h1>
  29. <slot name="b"></slot>
  30. </div>`,
  31. }
  32. var vm = new Vue({
  33. el: '.app',
  34. data: {},
  35. components: {
  36. home,
  37. }
  38. })
  39. </script>
  40. </html>

7 vue-cli

  1. # vue的脚手架:快速帮我们创建出vue的项目
  2. # vue2 和 vue3
  3. -vue-cli可以创建vue2vue3的项目 webpack构建工具
  4. -Vite:新一代构建工具
  5. -vue3上,推荐使用ts js
  6. # 先安装nodejs 后端语言---》语法就是js的语法
  7. -js运行在浏览器中,浏览器中有它的解释器环境
  8. -不能运行在操作系统之上,把chrom浏览器的v8引擎,把它安装在操作系统上
  9. -c语言写了内置库:文件操作,网络操作
  10. -官网:https://nodejs.org/zh-cn/download/ ,下载,一路下一步
  11. -安装完会释放两个命令(在环境变量中,任意路径都能敲这俩命令)
  12. -node python3
  13. -npm pip
  14. -cnpm 等同于pip ,只是下模块,直接取淘宝镜像站下载,速度快
  15. # 安装vue-cli ,通过脚手架创建vue项目 (django--->django项目--->django-admin)
  16. cnpm install -g @vue/cli
  17. -只要装成功,又会多出一个可执行文件 vue
  18. # npm 下载时候,去国外,速度慢,使用国内镜像
  19. -淘宝做了一个cnpm可执行文件,用来替换npm,以后所有使用npm的地方都换成cnpm即可
  20. -安装cnpm
  21. npm install -g cnpm --registry=https://registry.npm.taobao.org
  22. # 创建vue项目
  23. vue create myfirstvue
  24. # ide的选择(vscode,webstorm:jetbrains公司的,跟pycharm一家的,使用习惯一样)
  25. -选择使用pycharm+vue插件 开发vue项目
  26. -使用pycharm打开vue项目
  27. # 运行vue项目
  28. -方式一:在命令行中敲:npm run serve
  29. -方式二:在pycharm中点击绿色箭头运行
  30. #cnpm install axios

node.js环境搭建

  1. # Vue-CLI 项目搭建
  2. -vue 脚手架 可以创建vue项目
  3. # vue脚手架必须要按照 node js 解释型语言
  4. -node js是一门后端语言
  5. -JavaScript只能运行在浏览器中,因为浏览器中有他的解释器环境
  6. -基于谷歌浏览器的v8引擎(js解释器),使它能够运行在操作系统上
  7. -文件操作
  8. -网络操作
  9. -数据库操作 模块
  10. # 安装node.js解释器环境
  11. -nodejs 解释器环境
  12. -http://nodejs.cn/ 下载对应平台的nodejs解释器
  13. -一路下一步安装
  14. -安装完成会有两个可执行问题
  15. python node
  16. pip npm
  17. -打开cmd
  18. node 进入到了node环境
  19. npm install 装模块

脚手架:

image-20230217122411128

浏览器具备javascript环境:

image-20230217122556036

node.js 基于浏览器(有扩展)的js解释器 使得js代码能运行在操作系统上。

使得js就可以写后端。

安装node.js:

image-20230217122942029

下载16版本:

image-20230217123017320

示例:

image-20230217123236051

npm:

image-20230217123257863

扩展

  1. 事件总线 用的少
  2. 自定义指令 太专业
  3. 过滤器 用的少

作业

  1. # 获取所有图书接口drf写,处理跨域(响应头)
  2. # 前端vue项目首页,只要加载好就获取所有图书v-for循环显示在页面上
  3. ----------------------------------------------------------
  4. # 实时监控你机器的cpu使用了,使用折线图展示

原文链接:https://www.cnblogs.com/passion2021/p/17130749.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号