vue@2.6.14小目标列表

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue@2.6.14小目标列表相关的知识,希望对你有一定的参考价值。

阅读目录

运行效果

源码

html 代码中需要插入css 代码,在最下方需插入vue 代码即可运行。

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<!--插入css-->
</head>
<body>
<div id="app" class="main">
    <h2>小目标列表</h2>
    <div class="list">
        <h3>添加小目标</h3>
        <input type="text" class="text-keyword" placeholder="输入小目标后,按回车确认" @keyup.13='addList' v-model="addText"/>
        <!--如果noend等于0,就是全部完成了就显示‘全部完成了’,如果没有就是显示已完成多少条(prolist.length-noend)和未完成多少条(noend)-->
        <p>共有prolist.length个目标,noend==0?"全部完成了":'已完成'+(prolist.length-noend)+',还有'+noend+'条未完成'</p>
        <p>
            <input type="radio" name="chooseType" checked="true" @click='chooseList(1)'/><label>所有目标</label>
            <input type="radio" name="chooseType" @click='chooseList(2)'/><label>已完成目标</label>
            <input type="radio" name="chooseType" @click='chooseList(3)'/><label>未完成目标</label>
        </p>
    </div>
    <ul>
        <li class="li1" v-for="(list,index) in newList" :class="'eidting':curIndex===index">
            <div>
                <span class="status-span" @click="changeType(index)" :class="'status-end':list.status"></span>
                <span @dblclick="curIndex=index">list.name</span>
                <span class="close" @click='delectList(list)'>X</span>
            </div>
            <input type="text" class="text2" v-model='list.name' @keyup.esc='cancelEdit(list)' @blur='edited' @focus='editBefore(list.name)' @keyup.enter='edited' v-focus/>
        </li>
    </ul>
</div>
</body>
<!--插入js-->
</html>

CSS

<style>
body

	font-family:微软雅黑;
	font-size:14px;


input

	font-size:14px;


body,ul,div,html

	margin:0;
	padding:0;


.main

	width:800px;
	margin:0 auto;


li

	list-style-type:none;
	line-height:40px;
	position:relative;
	border:1px solid transparent;
	padding:0 20px;


li .status-span

	display:block;
	width:10px;
	height:10px;
	background:#ccc;
	float:left;
	margin:14px 10px 0 0;


li .status-span.status-end

	background:#09f;


li .close

	position:absolute;
	color:red;
	font-size:20px;
	line-height:40px;
	height:40px;
	right:20px;
	cursor:pointer;
	display:none;
	top:0;


li:hover

	border:1px solid #09f;


.text-keyword

	box-sizing:border-box;
	width:100%;
	height:40px;
	padding-left:10px;
	outline:none;


.hidden,li.eidting div

	display:none;


li:hover .close,li div,li.eidting .text2

	display:block;


li .text2,li .text-keyword

	height:40px;
	padding-left:10px;
	box-sizing:border-box;
	margin-left:10px;
	width:80%;
	display:none;

</style>

JS

<script src="https://unpkg.com/vue@2.6.14/dist/vue.min.js"></script>
<script type="text/javascript">
new Vue(
    el: "#app",
    data: 
        addText:'',
        //name-名称,status-完成状态
        prolist:[
            name:"HTML5",status:false,
            name:"CSS3",status:false,
            name:"vue",status:false,
            name:"react",status:false
        ],
        newList:[],
        curIndex:'',
        beforeEditText:"",
        curType:0
    ,
    computed:
        //计算属性,返回未完成目标的条数,就是数组里面status=false的条数
        noend:function()
            return this.prolist.filter(function(item)
                return !item.status
            ).length;
        
    ,
    methods:
        addList()
            //添加进来默认status=false,就是未完成状态
            this.prolist.push(
                name:this.addText,
                status:false
            );
            //添加后,清空addText
            this.addText="";
        ,
        chooseList(type)
            //type=1时,选择所有目标
            //type=2时,选择所有已完成目标
            //type=3时,选择所有未完成目标
            this.curType=type;
            switch(type)
                case 1:this.newList=this.prolist;break;
                case 2:this.newList=this.prolist.filter(function(item)return item.status);break;
                case 3:this.newList=this.prolist.filter(function(item)return !item.status);break;
            
        ,
        /*改变单条数据的完成状态*/
        changeType(index)
            this.newList[index].status=!this.newList[index].status;
            //更新数据
            this.chooseList(this.curType);
        ,
        delectList(list)
            var index=this.prolist.indexOf(list);
            //根据索引,删除数组某一项
            this.prolist.splice(index,1);
            //更新newList  newList可能经过this.prolist.filter()赋值,这样的话,删除了prolist不会影响到newList  那么就要手动更新newList
            //this.newList=this.prolist;
            this.chooseList(this.curType);
        ,
        //修改前
        editBefore(name)
            //先记录当前项(比如这一项,name:"HTML5",status:false)
            //beforeEditText="HTML5"
            this.beforeEditText=name;
        ,
        //修改完成后
        edited()
            //修改完了,设置curIndex="",这样输入框就隐藏,其它元素就会显示。因为在li元素 写了::class="'eidting':curIndex===index"  当curIndex不等于index时,eidting类名就清除了!
            //输入框利用v-model绑定了当前项(比如这一项,name:"HTML5",status:false)的name,当在输入框编辑的时候,比如改成‘HTML’,实际上当前项的name已经变成了‘HTML’,所以,这一步只是清除eidting类名,隐藏输入框而已
            //还有一个要注意的就是虽然li遍历的是newList,比如改了newList的这一项(name:"HTML5",status:false),比如改成这样(name:"HTML",status:true)。实际上prolist的这一项(name:"HTML5",status:false),也会被改成(name:"HTML",status:true)。因为这里是一个对象,而且公用一个堆栈!修改其中一个,另一个会被影响到
            this.curIndex="";
        ,
        //取消修改
        cancelEdit(val)
            //上面说了输入框利用v-model绑定了当前项(比如这一项,name:"HTML5",status:false)的name,当在输入框编辑的时候,比如改成‘HTML’,实际上当前项的name已经变成了‘HTML’,所以,这一步就是把之前保存的beforeEditText赋值给当前项的name属性,起到一个恢复原来值得作用!
            val.name=this.beforeEditText;
            this.curIndex="";
        
    ,
    mounted()
        //初始化,把prolist赋值给newList。默认显示所有目标
        this.newList=this.prolist;
    ,
    directives:
        "focus":
            update(el)
                el.focus();
            
        
    
);
</script>

原理分析和实现

首先,还是先把布局写好,和引入vue,准备vue实例,这个不多说,代码如下。

步骤 1 布局和引入 vue

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
body 
    font-family: "微软雅黑";
    font-size: 14px;


input 
    font-size: 14px;


body,
ul,
div,
html 
    padding: 0;
    margin: 0;


.hidden 
    display: none;


.main 
    width: 800px;
    margin: 0 auto;


li 
    list-style-type: none;
    line-height: 40px;
    position: relative;
    border: 1px solid transparent;
    padding: 0 20px;


li .type-span 
    display: block;
    width: 10px;
    height: 10px;
    background: #ccc;
    margin: 14px 10px 0 0;
    float: left;


li .close 
    position: absolute;
    color: #f00;
    font-size: 20px;
    line-height: 40px;
    height: 40px;
    right: 20px;
    cursor: pointer;
    display: none;
    top: 0;


li:hover 
    border: 1px solid #09f;


li:hover .close 
    display: block;


li .text-keyword 
    height: 40px;
    padding-left: 10px;
    box-sizing: border-box;
    margin-left: 10px;
    width: 80%;
    display: none;


.text-keyword 
    box-sizing: border-box;
    width: 100%;
    height: 40px;
    padding-left: 10px;
    outline: none;

</style>
</head>
<body>

<div id="app" class="main">
    <h2>小目标列表</h2>
    <div class="list">
        <h3>添加小目标</h3>
        <input type="text" class="text-keyword" placeholder="输入小目标后,按回车确认" />
        <p>共有N个目标</p>
        <p>
            <input type="radio" name="chooseType" checked="true" /><label>所有目标</label>
            <input type="radio" name="chooseType" /><label>已完成目标</label>
            <input type="radio" name="chooseType" /><label>未完成目标</label>
        </p>
    </div>
    <ul>
        <li class="li1">
            <div>
                <span class="type-span"></span>
                <span>html5</span>
                <span class="close">X</span>
            </div>
        </li>
        <li class="li1">
            <div>
                <span class="type-span"></span>
                <span>css3</span>
                <span class="close">X</span>
            </div>
        小程序基础12:列表渲染

微信小程序之for循环

小程序模板渲染

Nuxtjs:Vue 包版本不匹配:vue@3.2.22 和 vue-server-renderer@2.6.14

vue@2.6.14选项卡

npm 错误!如何使用 vue@2.6.14 安装满足对等依赖的编译器-sfc?