五分钟带你玩转vue(二)组件

举报
小鲍侃java 发表于 2021/09/10 00:05:48 2021/09/10
【摘要】 组件的生命周期 <template><div> <button v-on:click = "clickButton" name = "button" type = "button">按钮</button> {{message}}</div></templat...

组件的生命周期


  
  1. <template>
  2. <div>
  3. <button v-on:click = "clickButton" name = "button" type = "button">按钮</button>
  4. {{message}}
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'ComponentDemo',
  10. data () {
  11. return {
  12. message:"改变之前"
  13. }
  14. },
  15. methods: {
  16. clickButton(){
  17. this.message = "改变之后"
  18. }
  19. },
  20. //组件被创建之前
  21. beforeCreate() {
  22. console.log("组件被创建之前")
  23. },
  24. created() {
  25. console.log("组件被创建之后")
  26. },
  27. beforeMount() {
  28. console.log("组件被渲染之前")
  29. },
  30. mounted() {
  31. console.log("组件被渲染之后")
  32. },
  33. beforeUpdate() {
  34. console.log("数据改变渲染之前")
  35. },
  36. updated() {
  37. console.log("数据改变渲染之后")
  38. },
  39. beforeDestroy() {
  40. console.log("销毁之前")
  41. },
  42. destroyed() {
  43. console.log("销毁之后")
  44. }
  45. }
  46. </script>

scoped用法


  
  1. <style scoped> //只在当前组件生效
  2. </style>

简单组件使用


  
  1. 组件
  2. <template>
  3. <div>
  4. 我是组件啊
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'demoOne',
  10. el: '#app',
  11. data () {
  12. return {
  13. }
  14. }
  15. }
  16. </script>
  17. <style scoped>
  18. </style>
  19. 主页
  20. <template>
  21. <div>
  22. 我是主页
  23. <demoOne/>
  24. </div>
  25. </template>
  26. <script>
  27. import demoOne from './demoOne.vue'
  28. export default {
  29. name: 'HelloWorld',
  30. el: '#app',
  31. data () {
  32. return {
  33. }
  34. },
  35. components:{
  36. demoOne
  37. }
  38. }
  39. </script>

父传子


  
  1. app.vue
  2. <template>
  3. <div id="app">
  4. <parent/>
  5. </div>
  6. </template>
  7. <script>
  8. import parent from './components/parent.vue'
  9. export default {
  10. name: 'App',
  11. components:{
  12. parent
  13. }
  14. }
  15. </script>
  16. <style>
  17. </style>
  18. parent.vue
  19. <template>
  20. <div>
  21. <p>我是父亲</p>
  22. <son title="你好儿子" v-bind:thing = "thing"/>
  23. </div>
  24. </template>
  25. <script>
  26. import son from './son.vue'
  27. export default {
  28. name: 'parent',
  29. data () {
  30. return {
  31. thing:"给你钱"
  32. }
  33. },
  34. components:{
  35. son
  36. }
  37. }
  38. </script>
  39. <style>
  40. </style>
  41. son.vue
  42. <template>
  43. <div>
  44. 我是儿子
  45. 父亲对我说{{title}}-{{thing}}-{{age}}
  46. </div>
  47. </template>
  48. <script>
  49. export default {
  50. name: 'son',
  51. data () {
  52. return {
  53. }
  54. },
  55. props:{
  56. title:String,
  57. thing:String,
  58. age: {
  59. type: Number,
  60. default: 100
  61. }
  62. }
  63. }
  64. </script>
  65. <style scoped>
  66. </style>

父传子中 子组件接收时的验证


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

子传父


  
  1. app.vue
  2. <template>
  3. <div id="app">
  4. <parent/>
  5. </div>
  6. </template>
  7. <script>
  8. import parent from './components/parent.vue'
  9. export default {
  10. name: 'App',
  11. components:{
  12. parent
  13. }
  14. }
  15. </script>
  16. <style>
  17. </style>
  18. parent.vue
  19. <template>
  20. <div>
  21. <p>我是父亲</p>
  22. <son v-on:getMessage = "getMsg" title="你好儿子"/>
  23. 儿子跟我说话了{{msg}}
  24. </div>
  25. </template>
  26. <script>
  27. import son from './son.vue'
  28. export default {
  29. name: 'parent',
  30. data () {
  31. return {
  32. msg:null
  33. }
  34. },
  35. components:{
  36. son
  37. },
  38. methods: {
  39. getMsg(data){
  40. this.msg = data
  41. }
  42. }
  43. }
  44. </script>
  45. <style>
  46. </style>
  47. son.vue
  48. <template>
  49. <div>
  50. <button v-on:click = "sendMessage" name = 'button' type = "button">说话</button>
  51. </div>
  52. </template>
  53. <script>
  54. export default {
  55. name: 'son',
  56. data () {
  57. return {
  58. message:"你好父亲"
  59. }
  60. },
  61. methods: {
  62. sendMessage(event){
  63. this.$emit("getMessage",this.message);
  64. }
  65. }
  66. }
  67. </script>
  68. <style scoped>
  69. </style>

插槽

如果子组件没有使用插槽,父组件如果需要往子组件中填充模板或者html, 是没法做到的

视图传递


  
  1. app.vue
  2. <template>
  3. <div id="app">
  4. <HelloWorld>
  5. <!-- 依然在父组件中渲染 -->
  6. <!--普通插槽-->
  7. <!-- <p>我是父亲你好插槽</p> -->
  8. <!-- 具名插槽 -->
  9. <div slot ="demo">
  10. <p>aaaa</p>
  11. <p>bbbb</p>
  12. <p>cccc</p>
  13. </div>
  14. <p slot = "demo2">{{message}}</p>
  15. <!-- 接收儿子传递的 -->
  16. <p slot = "demo3" slot-scope = "props">{{props.text}}</p>
  17. </HelloWorld>
  18. </div>
  19. </template>
  20. <script>
  21. import HelloWorld from './components/HelloWorld.vue'
  22. export default {
  23. name: 'App',
  24. components:{
  25. HelloWorld
  26. },
  27. data () {
  28. return {
  29. message:"this is message"
  30. }
  31. }
  32. }
  33. </script>
  34. <style>
  35. </style>
  36. HelloWorld.vue
  37. <template>
  38. <div>
  39. <!-- 父亲的数据在儿子中显示 -->
  40. <!-- <slot>普通插槽</slot> -->
  41. <slot name= "demo">具名插槽1</slot>
  42. <slot name= "demo2">具名插槽2</slot>
  43. <!-- 儿子传递给父亲 -->
  44. <slot name= "demo3" v-bind:text = "message">儿到父</slot>
  45. </div>
  46. </template>
  47. <script>
  48. import demoOne from './demoOne.vue'
  49. export default {
  50. name: 'HelloWorld',
  51. data () {
  52. return {
  53. message:"儿子到父亲"
  54. }
  55. },
  56. components:{
  57. demoOne
  58. }
  59. }
  60. </script>

缓存keep-alive

重新创建动态组件的行为通常是非常有用的,但是在这个案例中,我们更希望那些标签的组件实例能够被在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个 <keep-alive> 元素将其动态组件包裹起来。


  
  1. app.vue
  2. <template>
  3. <div id="app">
  4. <button v-on:click = "clickButton" name = "button" type = "button">切换</button>
  5. <!-- 可以尝试去掉keep-alive -->
  6. <keep-alive>
  7. <!-- 失活的组件将会被缓存!-->
  8. <component v-bind:is="stutas"></component>
  9. </keep-alive>
  10. </div>
  11. </template>
  12. <script>
  13. import HelloWorld from './components/HelloWorld.vue'
  14. import HelloWorld2 from './components/HelloWorld2.vue'
  15. export default {
  16. name: 'App',
  17. components:{
  18. HelloWorld,
  19. HelloWorld2
  20. },
  21. data () {
  22. return {
  23. stutas:HelloWorld
  24. }
  25. },
  26. methods: {
  27. clickButton(event){
  28. if(this.stutas ==HelloWorld){
  29. this.stutas = HelloWorld2
  30. }else{
  31. this.stutas = HelloWorld
  32. }
  33. }
  34. },
  35. }
  36. </script>
  37. <style>
  38. </style>
  39. HelloWorld.vue
  40. <template>
  41. <div>
  42. <button v-on:click = "clickButton1" name = "button" type = "button">1组件切换</button>
  43. {{content}}
  44. </div>
  45. </template>
  46. <script>
  47. export default {
  48. name: 'HelloWorld',
  49. data () {
  50. return {
  51. content:"组件1"
  52. }
  53. },
  54. methods:{
  55. clickButton1(event){
  56. this.content = "我刚刚点击了"
  57. }
  58. }
  59. }
  60. </script>
  61. HelloWorld2.vue
  62. <template>
  63. <div>
  64. HelloWorld2
  65. </div>
  66. </template>
  67. <script>
  68. export default {
  69. name: 'HelloWorld2',
  70. data () {
  71. return {
  72. }
  73. }
  74. }
  75. </script>

 

来源:https://study.163.com/course/courseLearn.htm?courseId=1004938024#/learn/video?lessonId=1279462156&courseId=1004938024

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/103773490

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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