vue 组件:

目录:

组件:

构成组件:

-----------------

组件:

组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能。

demo:

 <h2>vue-component</h2>
  <hr>
  <div id="container">
    <h3>爱吃什么水果? app 实例</h3>
      <ol>
        <todolist
        ></todolist>
      </ol>
  </div>

  <div id="container2">
    <h3>爱吃什么水果? app2 实例</h3>
      <ol>
        <todolist
        ></todolist>
      </ol>
  </div>

  <div>
    <h3>爱吃什么水果?</h3>
    组件没有在任何实例中,所以不显示 <font color="red">「组件一定要挂载到某个 Vue 实例中,否则不会生效」</font>
      <ol>
        <todolist
        ></todolist>
      </ol>
  </div>

  <script type="text/javascript">
    // 定义一个子组件
    var child = Vue.extend({
      template: '<div>嵌套在 todolist 组件中</div>',
    })
    // 定义一个组件构造器,不是实例
    var todolist = Vue.extend({
      template:'<div><li v-for="(item,index) in datas" @click="showName(index)">{{item.text}}</li> <br/><child></child></div>',
      data() {
        return {
          datas:[
           { id: 0, text: '苹果' },
           { id: 1, text: '香蕉' },
           { id: 2, text: '只要是水果我都爱吃' }
         ]
        }
      },
      methods:{
        showName(index){
          alert(this.datas[index].text)
        }
      },
      components: {
        'child': child
      }
    })

    // 全局组件注册
    // Vue.component('todolist',todolist)
    // 定义一个 Vue 实例
    var app = new Vue({
      el:"#container",
      data:{},
      components: {
        'todolist': todolist
      }
    })
    // 定义另一个 Vue 实例
    var app2 = new Vue({
      el:'#container2'
    })
  </script>

组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B 。它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件。然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的。这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性。

在 Vue.js 中,父子组件的关系可以总结为 props down, events up 。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。看看它们是怎么工作的。

props down, events up

字面量语法 vs 动态语法

初学者常犯的一个错误是使用字面量语法传递数值:

<!-- 传递了一个字符串"1" -->
<comp some-prop="1"></comp>

因为它是一个字面 prop ,它的值以字符串 "1" 而不是以实际的数字传下去。如果想传递一个实际的 JavaScript 数字,需要使用 v-bind ,从而让它的值被当作 JavaScript 表达式计算:

动态 Props

类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:

demo:

<h4>以下是 props 例子</h4>
    props 传递方法,回调的时候,把 message「你好」 传递回来「使用 props 中的 message 作为子组件的 data」
    <hr>
  <div id="app2">
    <!-- 如果要使用 props 来传递对象,就要使用 v-bind  -->
    <!-- 注意:在这里 age 在 props 中规定了要传入数字类型,这里传入 String 是为了演示效果,正式中使用要按照 age=100 来传入 -->
    <mycomponent
      message="你好"
      :mydata="{username:'tigerchain',age:28}"
      name-style="color:red"
      age="100"
      :clickme="show"
      />
  </div>
  <script>
    // 定义一个样式
    var imgStyle = {
      height: '40px',
      width: '40px'
    }

    var vm = new Vue({
      el: '#container',
      data: {
        msg:"123",
        imgStyle:imgStyle,
        imgSrc:'./imgs/logo.png',
        show:true,
        clickBtnText:'',
        isDivStyle:true
      }
    })

    // 定义一个组件
    var myComponent = Vue.extend({
      // 定义 props 就是一些默认值
      props: {
        message:"",
        mydata:{},
        //样式 ,如果这里使用驼峰标识 ,则在标签中使用就要使用 name-style 传递
        nameStyle:{},
        // 这里规定传递过来的数据必须是数字,否则后台会报警告
        age: Number,
        clickme:{
          type:Function
        }
      },
      data(){
        return {
          // 可以在数据里面将 props 值赋给 data 值,然后就可以修改这个值,但是原始的 props 中的值是修改不了的
          msg:this.message
        }
      },
      template: '<div>'+
                  '{{ message }}--{{msg}}'+
                  '<div>'+
                     '<span v-bind:style="nameStyle" @click="clickme()">{{ mydata.username}} {{this.age}}</span>'+
                     '<button @click="clickme(msg)">点击我</button>'+
                  '</div>'+
                ' </div>'
    })
发布了595 篇原创文章 · 获赞 11 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/xiamaocheng/article/details/104695783