Vue——熟悉组件

news/2024/7/10 3:18:11 标签: vue

组件

关于组件的理解,可以认为是可复用的功能块,一个功能或许需要不等的组件,因此组件的通信也是要熟悉的,这个是跟着教程做的一个小的实例,主要是了解组建的嵌套和传值。


页面

页面要实现能够增加或删除一个数据

页面很简单,主要就是添加用户名和评论,在点击提交之后把值渲染出来


分析

页面的布局是很简单的头部、内容格式,因此主要是关心数据存放在哪,要怎么显示。
可以将左侧添加数据和右侧的数据展示分为单独的组件,这样能够方便维护。其次就是右侧会有很多评论,而每一个评论的布局都相似,所以可以将每一个评论分为一个组件被右侧单独引用。

在这里插入图片描述


根节点

根文件主要是把主要的结构框架搭建好

<template>
    <div>
        <header class="site-header jumbotron">
            <div class="container">
                <div class="row">
                    <div class="col-xs-12">
                        <h1>请发表对Vue的看法</h1>
                    </div>
                </div>
            </div>
        </header>
        <div class="container">
            <Add :addComment="addComment" />
            <List :comments="comments" :deleteComment= 'deleteComment'/>
        </div>
    </div>
</template>

<script>
import Add from './components/Add.vue'
import List from './components/List.vue'
export default {
    data () {
        return {
            comments: [
                {name: 'Bob', content: 'Vue还可以'},
                {name: 'jerry', content: 'Vue太简单'},
                {name: 'lily', content: 'Vue垃圾'}
            ]
        }
    },
    components: {
        Add,
        List
    },
    methods: {
        addComment (comment) {
            this.comments.unshift(comment)
        },
        deleteComment (index) {
            this.comments.splice(index, 1)
        }
    }
}
</script>

组件的引用是先在js中导入该文件,然后再vue实例中声明组件,就能够直接使用标签了。

<template>
    <div class="col-md-4">
        <form class="form-horizontal">
          <div class="form-group">
            <label>用户名</label>
            <input type="text" class="form-control" placeholder="用户名" v-model="name">
          </div>
          <div class="form-group">
            <label>评论内容</label>
            <textarea class="form-control" rows="6" placeholder="评论内容" v-model="content"></textarea>
          </div>
          <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
              <button type="button" class="btn btn-default pull-right" @click="add">提交</button>
            </div>
          </div>
        </form>
      </div>
</template>

<script>
export default {
    props: {
        addComment: {
            type: Function,
            required: true
        }
    },
    data () {
        return {
            name: '',
            content: ''
        }
    },
    methods: {
        add () {
            const name = this.name.trim()
            const content = this.content.trim()
            if (!name || !content) {
                alert('姓名或者内容不可为空')
                return
            }
            const comment = {
                name,
                content
            }
            this.addComment(comment)
            this.name = ''
            this.content = ''
        }
    }
}
</script>

左侧新增的组件主要是对输入框进行了绑定,对按钮添加了事件。提交的时候获取实例中的数据,根据实例中获取到父组件的函数参数来将此条数据添加到总数据中。然后清空输入框。

<template>
    <div class="col-md-8">
        <h3 class="reply">评论回复:</h3>
        <h2 v-show="comments.length === 0" >暂无评论,点击左侧添加评论!!!</h2>
        <ul class="list-group">
          <Item  v-for="(comment, index) in comments" :key="index" :comment="comment"
          :deleteComment="deleteComment" :index="index"/>
        </ul>
      </div>
</template>
<script>
import Item from './Item.vue'
export default {
    // 声明接收属性
    props: ['comments', 'deleteComment'],
    components: {Item}
}
</script>

<style >
	.reply {margin-top: 0px}
</style>

list中仅是创建好右侧展示的框架,实际的数据展示仍然在子组件中。根据数据的数量便利子组件,绑定每条数据的下标。

<template>
    <li class="list-group-item">
        <div class="handle">
            <a href="javascript:;" @click="deleteItem">删除</a>
        </div>
        <p class="user"><span>{{comment.name}}</span><span>说:</span></p>
        <p class="centence">{{comment.content}}</p>
    </li>
</template>

<script>
export default {
    props: {
        comment: Object,
        deleteComment: Function,
        index: Number
    },
    methods: {
        deleteItem () {
            const {comment, index, deleteComment} = this
            if (window.confirm(`确定删除${comment}?`)) {
                deleteComment(index)
            }
        }
    }
}
</script>

<style >
li {
  transition: .5s;
  overflow: hidden;
}

.handle {
  width: 40px;
  border: 1px solid #ccc;
  background: #fff;
  position: absolute;
  right: 10px;
  top: 1px;
  text-align: center;
}

.handle a {
  display: block;
  text-decoration: none;
}

.list-group-item .centence {
  padding: 0px 50px;
}

.user {
  font-size: 22px;
}
</style>

列表组件中获取list传来的数据,根据数据进行渲染,其中添加了删除的操作,但是操作是在根组件中,因此根组件将方法以 :functionName=“functionName” 的形式逐级传递。item在接受到触发事件的下标值后通过传来的方法直接删除。


总结

这个小实例只是简单的了解vue组件的代码格式化,并没有什么太大的价值。其中使用的eslint是真的逼疯我了,我天哪,这是什么鬼工具!


http://www.niftyadmin.cn/n/1834396.html

相关文章

Uedit32里面在哪儿设置去掉它自己生成的.bak文件?

打开菜单“高级”&#xff0d;“配置”&#xff0c;在打开的对话框左边找“文件处理”&#xff0d;“备份”&#xff0c;在右边选择“不备份”&#xff0c;再单击“确定”就行了。 转载于:https://www.cnblogs.com/SpringSmallGrass/archive/2013/04/13/3019181.html

转载:C++ typedef四个用法

第一、四个用途 用途一&#xff1a; 定义一种类型的别名&#xff0c;而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如&#xff1a;char* pa, pb; // 这多数不符合我们的意图&#xff0c;它只声明了一个指向字符变量的指针&#xff0c; // 和一个字符变量&#x…

Vue——组件通信

组建通信 组件之间的通信在任何框架中都是核心的内容&#xff0c;这一篇仅是看着视频教程和其他博主的内容来誊写的&#xff0c;因此更倾向于自己&#xff0c;对其他人可能没有什么参考价值。 拓展&#xff1a; vue组件间通信六种方式&#xff08;完整版 ——思否(浪里行舟)&a…

难重现的bug可能被忽视的条件

因为bug产生是需要条件的&#xff0c;但我们忽视或者没有重视这些条件时&#xff0c;有些bug就很难重现&#xff0c;下面是几个很容易被忽视的条件&#xff1a; 延时&#xff0c;dirty数据库或者特殊的输入数据&#xff0c;前期活动或者操作&#xff0c;dirty系统&#xff08;系…

IE6显示空白页面

今天昨天遇见一个比较郁闷的问题。 在firefox 和chrom浏览器下面页面显示正常。但是在ie6下面却之出现一个空白页面&#xff0c;也没有报js错误。查看源代码的时候&#xff0c;也是有内容的。 将查看的源代码另存为html用ie6访问却又是正常。 这肯定是ie6的一个bug。 最后找到了…

Vue——嵌套路由

路由 有关路由的详细信息可以去vue的官网去查看&#xff0c;我这里只是自己实例的一个理解和总结。 单页面程序离不开路由的分配&#xff0c;自始至终只有一个页面存活&#xff0c;因此有关路由跳转的逻辑要合理配置 vue-Router 选择官方使用的vue-router库&#xff0c;因此…

html / js / flash的视频、音频播放器

1.首先&#xff0c;目前最好的flash js的播放器&#xff0c;是JW Player&#xff0c;目前版本是6.0&#xff0c;这个免费版本&#xff0c;有JW的Logo&#xff0c;右键菜单也有JW的说明。但是&#xff0c;对于一般用户&#xff0c;这完全不碍事&#xff01;&#xff01; 2.当时…