zoukankan      html  css  js  c++  java
  • Vue提问二:(组件)

    1.全局组件组件怎么注册?data返回的是什么?组件怎么使用?组件的数据是否独立?

    2.组件必须要有根元素?组件的命名方式有哪两种?推荐用哪种?

    3.局部组件怎么定义?使用范围?

    4.vue的调试工具怎么用?

    5.props数组的数据是干嘛的?

    6.父组件怎么传值到子组件?

    7.当子组件标签中number或者布尔 绑定和不绑定的区别?

    <menu-item :pnum='12' pnum1 = "12"></menu-item>
    

    8.子组件可以通过props直接操作父组件中的数据(数组/对象等)吗?

    9.子组件通过自定义事件向父组件传递信息的方式?

    10.非父子组件间的传值

    11.插槽怎么使用?多个插槽呢?

    12.具名插槽怎么定义以及使用?

    13.作用域插槽怎么定义和使用?

    答案

    Vue.component('button-counter', {
        data: function () { 
          return {
            count: 0
          }
        },
        template: '<button @click="handle">点击了{{count}}次</button>',
        methods: {
          handle: function () {
            this.count += 1;
          }
        }
      })
    

    data 返回的是一个函数,每个组件的数据都是独立的

     <div id="app">
        <button-counter></button-counter>
      </div>
    

    组件摸板不能是两个同级的元素。必须要有两个模板。

    props命名规则:分为驼峰式(使用组件的适合,智能在字符串摸板字使用,在普通的标签摸板中使用,必须是短横线的方式)和横线式,推荐短横线的方法

    var HelloWorld = {
          data: function () {
            return {
              msg: 'HelloWorld'
            }
          },
          template: '<div>{{msg}}</div>'
        };
     var vm = new Vue({
          el: '#app',
          data: {},
          components: {
            'hello-world': HelloWorld,
          }});
    

    局部组件只能在注册他的父组件中使用,别的地方不可以使用

    用于接受父组件传值,在组件标签中绑定对应的值。

    <menu-item :menu-title='ptitle'></menu-item>
    Vue.component('menu-item', {
          props: ['menuTitle'],
          template: '<div>{{menuTitle}}</div>'
        });
    
    var vm = new Vue({
          el: '#app',
          data: {
            pmsg: '父组件中内容',
            ptitle: '动态绑定属性'
          }
        });
    

    加上绑定的pnum是一个数字类型/布尔类型,不加的是字符串类型

    可以,但是不推荐,props传递数据原则:单向数据流

    <menu-item  @enlarge-text='handle'></menu-item>
    自定义事件$emit("事件名",$event),$event代表传递的值 
    template: `
            <div>
              <button @click='$emit("enlarge-text")'>扩大父组件中字体大小</button>
            </div> `
    父组件定义方法
    methods: {
            handle: function(val){
              // 扩大字体大小
              this.fontSize += val;
            }
          }
    

    借助事件中心 来实现

    1. 创建事件中心对象

      var hub = new Vue();
      
    2. 在组件中定义监听函数

      Vue.component('test-tom', {
            template: `
              <div>
                  <button @click='handle'>点击</button>
              </div>`,
            methods: {
              handle: function(){//触发jerry-event事件
                hub.$emit('jerry-event', 2);
              }
            },
            mounted: function() {
              // 监听兄弟节点的tom-event事件
              hub.$on('tom-event', (val) => {
                this.num += val;
              });
            }
          });
      
    Vue.component('alert-box', {
          template: `
            <div>
              <strong>ERROR:</strong>
              <slot>默认内容</slot>  
            </div>
          `
        });
    
    <alert-box>这里面写的东西都会填充到插槽里面,如果不写则用默认的插槽内容</alert-box>
    

    12

    方法一:在模板中给slot添加一个name属性,在使用slot方法的时候加上slot="name名"

    <base-layout>
          <p slot='header'>标题信息</p>
          <p>主要内容1</p>
          <p>主要内容2</p>
          <p slot='footer'>底部信息信息</p>
    </base-layout>
    Vue.component('base-layout', {
          template: `
            <div>
              <header>
                <slot name='header'></slot>
              </header>
              <main>
                <slot></slot>
              </main>
              <footer>
                <slot name='footer'></slot>
              </footer>
            </div>
          `
        });
    

    方法二:或者使用template标签,使用该标签,template并不会被渲染到页面

    <base-layout>
          <template slot='header'>
            <p>标题信息1</p>
            <p>标题信息2</p>
          </template>
          <p>主要内容1</p>
          <p>主要内容2</p>
          <template slot='footer'>
            <p>底部信息信息1</p>
            <p>底部信息信息2</p>
          </template>
    </base-layout>
    

    13.详细的解释卡这个博客吧https://www.jianshu.com/p/e10baeff888d

    <fruit-list :list='list'>
          <template slot-scope='slotProps'>
            <strong v-if='slotProps.info.id==3' class="current">{{slotProps.info.name}}		         </strong>
            <span v-else>{{slotProps.info.name}}</span>
          </template>
    </fruit-list>
    Vue.component('fruit-list', {
          props: ['list'],
          template: `
            <div>
              <li :key='item.id' v-for='item in list'>
                <slot :info='item'>{{item.name}}</slot>
              </li>
            </div>
          `
        });
    
  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/li33/p/13536663.html
Copyright © 2011-2022 走看看