2020-08-28 Vue组件

1. 全局组件注册语法

image.png
image.png
image.png
image.png
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <btn-count></btn-count>
  </div>
</body>
<script src="./js/vue.js"></script>
<script>
    //组件注册
    Vue.component('btn-count',{
      data(){
        return {
          count:0
        }
      },
      template:
      `
      <button @click="add">点击了{{ count }}次</button>
      `
      ,
      methods:{
        add(){
          this.count++;
        }
      }
    })
    //vm实例,也是组件
    let vm = new Vue({
      el:'#app',
      data:{

      }
    })

</script>
</html>

2. 局部组件注册语法

** 局部组件只能在注册他的父组件中使用 **


image.png
 /*  局部组件单独定义*/
    let HelloWorld = {
      data(){
        return {
          msg:'helloworld'
        }
      },
      template:`<div>{{msg}}</div>`
    };
    let HelloVue = {
      data(){
        return {
          msg:'HelloVue'
        }
      },
      template:`<div>{{msg}}</div>`
    }

    //vm实例,也是组件
    let vm = new Vue({
      el:'#app',
      data:{

      },
      //局部组件,这里引用只能在#app的作用范围
      components:{
        'hello-world':HelloWorld,
        'hello-vue':HelloVue,
      }
    })

3. 非父子组件

image.png
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div>父组件</div>
    <test-tom></test-tom>
    <test-jack></test-jack>
  </div>

  <!-- ************** -->
  <template id="test-tom">
    <div>
      <div>tom:{{ num }}</div>
      <button @click="handle">点击</button>
    </div>
  </template>

  <template id="test-jack">
    <div>
      <div>jack:{{ num }}</div>
      <button @click="handle">点击</button>
    </div>
  </template>
<!-- ******************* -->
  <script src="./js/vue.js"></script>
  <script>
    //定于一个事件中心
    let eventBus = new Vue();

    //定义一个组件
    let TestTom = {
      data(){
        return {
          num:0
        }
      },
      template:'#test-tom',
      methods:{
        handle(){
          //触发兄弟组件的事件
          eventBus.$emit('jack-event',3)
        }
      },
      mounted(){
        //监听事件
        eventBus.$on('tom-event',(val)=>{
          //写箭头函数是为了方便this指向该组件
          this.num += val;
          //val是兄弟组件传递的值
        })
      }
    }

    //定义一个组件
    let TestJack = {
      data(){
        return {
          num:0
        }
      },
      template:'#test-jack',
      methods:{
        handle(){
          //触发兄弟组件的事件
          eventBus.$emit('tom-event',1)
        }
      },
      mounted(){
        //监听事件
        eventBus.$on('jack-event',(val)=>{
          //写箭头函数是为了方便this指向该组件
          this.num += val;
          //val是兄弟组件传递的值
        })
      }
    }


    let vm = new Vue({
      el:'#app',
      data:{

      },
      methods:{

      },
      components:{
        TestTom,
        TestJack
      }
    })
  </script>
</body>
</html>

三种不常用的通信

    1. ref通信
 <child ref="child"/>
  在父组件的
    this.$refs.child 就是这个子组件实例
  注意:
    不建议直接通过ref操作子组件 
    1. children , parent
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="app">
    <home></home>
  </div>
  <script>
    let CommonTitle = {
      props:['title','arr'],   //properties  props 父向子 传入的数据列表
      template:`
        <div>
            这是标题
          <h2>
            {{ title }}
          </h2>  
          <ul>
              <li v-for="item in arr" :key="item">
                  {{item}}
              </li>
          </ul>
        </div>
      `,
      data(){
        return {
          msg:123
        }
      },
      mounted(){
        console.log(this.$parent)
      }
    }
    let Home = {
      template:`
        <div>
         
          <common-title :title="title"></common-title>  
          home页内容  
        </div>
      `,
      data(){
        return {
          title:"我是home页111"
        }
      },
      mounted(){
        console.log(this.$children)
      },
      components:{
        CommonTitle
      }
    }
    let vm = new Vue({
      el:"#app",
      components:{
        Home
      }
    })
  </script>
</body>
</html>
    1. provide inject
父组件中
{
  provide:{
    msg:'1234',
    num:12
  },
  data,
  template,
  methods
}

子组件中 
{
  inject:['msg','num']

  // 挂载到了 子组件的 实例的 属性上  注意不要和data或者props或者计算属性或methods重名
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容