vue.js入门(二,引入组件)

安装 vue脚手架 vue-cli npm install -g vue-cli 注意这里是2.x版本 3.x后面再讲


这里的话 是否安装router 打y 前面默认回车就行

敲入代码就可以了


那么在config目录下的index.js可以修改相关端口与是否自动启动浏览器,这个就随意了,目录文件不解释

如何引入组件

首先在components中新建一个vue文件,顺便清空一下主组件App.vue的内容,因为之前安装router的话App.vue中是使用router的方式引入别的组件的,待会使用es6的方式引入组件

在Test.vue中随意敲点内容


在App.vue中使用import 引入组件,引入之后需要注意的就是一定要在引入的vue文件中注册,也就是下方的components对象中,那么原始写法是{name:template},使用ES6写法省略了冒号,然后就可以在上方使用了,并可以重复使用,那么CLI是有热更新的,只需要保存代码浏览器即可自动更新

这样看起来是不是就像上篇写的例子了,搬过来再写一遍

<template>
  <div id="app">
    <div>
      <input type="text" v-model="info">
      <button @click="handleClick">添加</button>
    </div>
    <ul>
      <Test v-for="(item,index) in list" :key="index" :item="item"></Test>
    </ul>
    
  </div>
</template>

<script>
import Test from './components/Test'
export default {
  name: 'App',
  data(){
    return {
      list:[],
      info:''
    }
  },
  methods:{
    handleClick(){
      this.list.push(this.info)
      this.info=''
    }
  },
  components:{
      Test
  }
}
</script>

<style>

</style>

Test.vue中也修改一下


那么效果也OK了~可以看到在这个例子里,Test.vue嵌套在了App.vue中,那么此时App.vue就是Test.vue的父组件,Test.vue就是子组件了,这个概念可以吸收一下!可以看到子组件中是没有数据的,数据在父组件中,把其他组件的数据传递给自己这个过程叫组件间的通信。那么刚才这个过程可以理解为父子组件之前的通信,emmm 先点到为止

那么在传递数据的时候,首先传递的值需要v-bind(:)来绑定,同时在接收数据的组件中通过props来接收并用{{}}来解析,比较好理解,如果再加一个值呢?

子组件只需

<template>
    <div>
        <li>{{item}}---{{test}}</li>
    </div>
</template>

<script>
export default {
props:['item','test']
}
</script>

<style>

</style>

这里需要注意的是,在template中只能有一个根元素,也就是只有一个父元素,建议直接包个div就行

那么除了props传值还可以使用插槽solt传递


可以看到我取消了:item="item" 绑定,意味着子组件是没有属性可以接受的,那么在子组件中就需要使用slot来接收内容

<template>
    <div>
        <li>
            <slot></slot>
        </li>
    </div>
</template>

<script>
export default {

}
</script>

<style>

</style>

使用slot标签,效果相同,甚至可以传递标签,比如说


那么如何显示不同的slot呢?使用v-slot

<template>
    <div>
        <li>
            <slot name="item"></slot>
        </li>
    </div>
</template>

子组件中使用name来显示不同的内容


打开页面发现报了一个错,这个问题呢是 新语法(貌似是2.6的语法,没去关注)的问题,就是v-slot只能在template标签中


子组件不变,包个template传递即可,这个name传递称之为具名插槽
那么这里展示一下插槽的子组件返回父组件信息的操作,随便过一下(由于本人经验太少,可能这种通信方式用的少,并不常见吧)

<template>
    <div>
        
        <li>
            <input type="checkbox" v-model="checked"/>
            <slot name="item" v-bind="{checked}"></slot>
        </li>
    </div>
</template>

<script>
export default {
   data(){
       return{
           checked:false,
       }
   }
}
</script>

<style>

</style>

首先在子组件中,双向绑定一个布尔值,绑定在checked判断,默认false,每个input改变的都是自己返回的数据,这就是为什么data是一个函数的原因!在slot标签绑定一个对象,此处是缩写,也就是check:check,这个要习惯,不然会懵逼

      <Test v-for="(item,index) in list" v-bind:key="index">
           <template v-slot:item="itemProps" >
             <span   :style="{fontSize:'20px',color:itemProps.checked?'red':'blue'}">{{item}}</span>
           </template>
      </Test>

这里几个点注意,首先是v-slot:item 等号后面就是子组件返回的对象,准确的说是json
这里把style写成绑定状态,由于jsx模板的原因css需要使用驼峰写法,后面跟一个三元,看不懂后面会细讲,了解一下就行

那么此时效果就是这样

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文章是我最近在公司的一场内部分享的内容。我有个习惯就是每次分享都会先将要分享的内容写成文章。所以这个文集也是用来...
    Awey阅读 9,477评论 4 67
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,244评论 0 6
  • 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装...
    youins阅读 9,528评论 0 13
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,382评论 0 3
  • 冰销鱼潎潎(pi四声) 凌波起罗袜 初笄梦桃李(ji一声) 羽袖挥丹凤 (凌波微步,罗袜生尘) 男喜初冠女初笄,谁...
    如是缘起阅读 405评论 0 0