• Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用


    目录

    一、Vue

    1.1、标准开发方式

    1.2、组件的使用

    1.2.1、全局组件

    1.2.2、局部组件

    1.2.3、props 传递静态数据

    1.2.4、props 传递动态数据

    1.2.5、事件传递

    1.2.6、插槽slot


    一、Vue


    1.1、标准开发方式

    Vue 的标准开发方式是 SPA(Single Page Application):单页面web 应用,也就是收,日后的项目中只有一张页面(index.html).

    为什么要使用 SPA 开发方式?

    1. Vue 官方推荐:一个应用中只能存在一个 Vue 实例.
    2. 复用:Vue 提供了 Component 组件,不仅减少了 Vue 实例的代码量,还可以实现复用.
    3. 解耦合:一个组负责完成项目中的一个功能或者一组功能,实现业务隔离.

    1.2、组件的使用

    1.2.1、全局组件

    全局组件:直接注册到 Vue 根实例组件中.

    定义方式:Vue.component(' ', {})  ,第一个参数是组件名,第二个参数是配置对象.

    Ps:无论是使用全局组件还是局部组件,都必须在组件 template 中添加唯一根元素.

    如下代码:

    1. <div id="app">
    2. <register>register>
    3. div>
    4. <script src="../js/vue.js">script>
    5. <script>
    6. //定义全局组件(生效的前提是要有 Vue 实例, 并在实例的作用域中使用)
    7. Vue.component('register', {
    8. template: `

      注册

      {{msg}}{{counterSqrt}}
      `
      ,
    9. data() { //组件中定义数据,必须函数的形式(和 Vue 实例定义唯一的区别)
    10. return { //返回值是一个对象,对象内部就是数据
    11. msg: "我是注册全局组件中的数据",
    12. count: 2
    13. }
    14. },
    15. methods: { //给组件定义一些方法
    16. test() {
    17. console.log("我是组件中的方法");
    18. }
    19. },
    20. computed: { //给组件定义一些计算属性
    21. counterSqrt() {
    22. return this.count * this.count;
    23. }
    24. },
    25. components: { //给组件中定义一些组件
    26. comp: {
    27. template: `
      我是全局组件的子组件
      `
    28. }
    29. },
    30. beforeCreate() { //组件也有自己的生命周期
    31. console.log("beforeCreate:", this.msg);//此时 msg 因该是 undefine
    32. }
    33. //......
    34. });
    35. const app = new Vue({ //没有这里,组件就不会生效
    36. el: "#app"
    37. });

    效果如下:

     

    1.2.2、局部组件

    局部组件:只能在注册组件中使用组件.

    代码如下:

    1. <div id="app">
    2. <login>login>
    3. <reg>reg>
    4. div>
    5. <script src="../js/vue.js">script>
    6. <script>
    7. //定义局部组件(这是另一种方式,现在外部定义好,再到局部注册组件中引入)
    8. //Ps:在子组件中不可使用父组件的数据! 比如 parent 数据
    9. const login = {
    10. template: `

      登录

      {{ child }}{{ counterSqrt }}
      `
      ,
    11. data() {
    12. return {
    13. child: "我是注册组件的子组件 login 中的数据",
    14. count: 3
    15. }
    16. },
    17. methods: { //给组件定义一些方法
    18. test() {
    19. console.log("我是组件中的方法");
    20. }
    21. },
    22. computed: { //给组件定义一些计算属性
    23. counterSqrt() {
    24. return this.count * this.count;
    25. }
    26. },
    27. components: { //给组件中定义一些组件
    28. comp: {
    29. template: `
      我是子组件的子组件
      `
    30. }
    31. },
    32. beforeCreate() { //组件也有自己的生命周期
    33. console.log("beforeCreate:", this.child);//此时 child 因该是 undefine
    34. }
    35. //......
    36. }
    37. let app = new Vue({
    38. el: "#app",
    39. data: {
    40. parent: "我是父组件中的数据"
    41. },
    42. components: { //注册组件
    43. login, //也可以单独在外面定义好组件,然后引入
    44. reg: {
    45. template: `
      {{ child }}
      `
      ,
    46. data() { //注意组件中数据的写法
    47. return {
    48. child: "我是子组件 reg 中的数据"
    49. }
    50. }
    51. }
    52. }
    53. });
    54. script>

    效果如下:

    1.2.3、props 传递静态数据

    父组件向子组件传递静态数据:在使用的组件标签上,声明静态数据 key=value (key 是自定义的),最后在子组件的 props 中声明对应的  key 即可

    代码如下:

    1. <div id="app">
    2. <login name="hello?" count="1">login>
    3. div>
    4. <script src="../js/vue.js">script>
    5. <script>
    6. const login = {
    7. template: `

      登录

      {{ name }} --- {{ count }}
      `
      ,
    8. data() {
    9. return {
    10. //这里相当于添加了 name: "hello?", count="1"
    11. }
    12. },
    13. props: ['name', 'count'] //用来接收父组件传来的数据, 这就相当于在子组件的 data 中添加了这个静态数据
    14. }
    15. const app = new Vue({
    16. el: "#app",
    17. components: {
    18. login //注册组件
    19. }
    20. });
    21. script>

    效果如下:

    1.2.4、props 传递动态数据

    向子组件传递动态数据:

    1. 在组件标签上声明 key=value (key 是自定义的,value 就是 Vue 实例中的 data),子组件内部使用 props 数组声明 key 
    2. 声明的自定义 key 可以通过 v-bind 进行属性的动态绑定

    Ps:Vue 官方明确提出只允许单向数据流,也就是只能从父传递到子,否则会报警告

    代码如下:

    1. <div id="app">
    2. <login :aa="count">login>
    3. <input type="text" v-model="count">
    4. div>
    5. <script src="../js/vue.js">script>
    6. <script>
    7. const login = {
    8. template: `

      登录

      {{ aa }}

    9. data() {
    10. return {
    11. }
    12. },
    13. props: ['aa'],
    14. methods: {
    15. add() {
    16. this.aa++;//props 声明的数据,就相当于直接 data 中添加了该数据
    17. }
    18. }
    19. }
    20. const app = new Vue({
    21. el: "#app",
    22. data: {
    23. count: "1"
    24. },
    25. components: {
    26. login
    27. }
    28. });
    29. script>

    最后的效果:

    1. 修改 input 中的值 
    2. 由于 v-model 动态绑定到 Vue实例中的 data 的 count 数据也随之变化
    3. 由于 login 组件中声明的属性 aa 动态绑定了 count,导致 属性aa 也随之变化

    如下图

    1.2.5、事件传递

    父向子传递事件:在组件标签上定义 @key=value (@自定义事件名=父组件中的事件名) 即可

    代码如下:

    1. <div id="app">
    2. <login @aa="testParent()" @bb="testParent2" @cc="testParent3">login>
    3. div>
    4. <script src="../js/vue.js">script>
    5. <script>
    6. const login = {
    7. template: `

      登录

      `
      ,
    8. data() {
    9. return {
    10. count: 10
    11. }
    12. },
    13. methods: {
    14. testChild() {
    15. alert("我是子组件中的事件!");
    16. //通过 this.$emit 来调用父组件中的事件
    17. //参数1:组件标签上定义的事件名
    18. //后续参数: 参数1 后面还可以继续传递参数,作为父组件事件中的参数
    19. this.$emit("aa");
    20. this.$emit("bb", this.count); //Vue 官方说只能单向传递(父传子),但是这种方式可以实现
    21. this.$emit("cc", { count: this.count, name: "cyk", isGood: true });
    22. }
    23. }
    24. }
    25. const app = new Vue({
    26. el: "#app",
    27. methods: {
    28. testParent() {
    29. alert("1.我是父组件中的事件!");
    30. },
    31. testParent2(count) {
    32. alert("2.我是父组件中的事件!");
    33. console.log("获取到子组件的值:" + count);
    34. },
    35. testParent3(obj) {
    36. alert("3.我是父组件中的事件!");
    37. console.log("获取到子组件的值: count=" + obj.count + ", name=" + obj.name + ", isGood=" + obj.isGood);
    38. }
    39. },
    40. components: {
    41. login
    42. }
    43. });
    44. script>

    效果如下:

    1.2.6、插槽slot

    插槽就是用来扩展现有组件的.

    代码如下:

    1. <div id="app">
    2. <login>login>
    3. <hr>
    4. <login><span>hellospan>login>
    5. <hr>
    6. <login><button slot="aa" @click="parent()">点我button>login>
    7. div>
    8. <script src="../js/vue.js">script>
    9. <script>
    10. const login = {
    11. template: `<div><slot name="aa">slot><h1>登录h1><slot name="bb">slot>div>`,
    12. }
    13. const app = new Vue({
    14. el: "#app",
    15. methods: {
    16. parent() {
    17. alert("我是父组件的事件");
    18. }
    19. },
    20. components: {
    21. login
    22. }
    23. });
    24. script>

    效果如下:

     

  • 相关阅读:
    古代流传最广的19个智谋故事
    JavaScript中判断数据类型,浅拷贝和深拷贝详解
    C++ 可调用对象绑定器bind()
    【Vue】从vue2到vue3,生命周期函数有何变化之详解
    mac本安装Frida
    关于我加了一行日志搞崩了服务这件小事
    JDBC知识【JDBC API详解】第三章下篇
    nodejs+vue 高校社团综合服务系统elementui
    微信小程序之会议OA系统首页布局搭建与Mock数据交互
    扎根理论分析软件NVivo原理与技术应用
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/133882724