目录
html:
- DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- <link href="style.css" type="text/css" rel="stylesheet"/>
- head>
- <body>
-
- <div class="main">
-
- <div class="header">
- <input type="text" placeholder="输入项目,按回车键添加" />
- div>
-
- <div class="list">
- <ul>
- <li><input type="checkbox"/> Vue <input type="button" value="删除" class="btn"/>li>
- <li><input type="checkbox" />React<input type="button" value="删除" class="btn"/>li>
- <li><input type="checkbox" />Java<input type="button" value="删除" class="btn"/>li>
- <li><input type="checkbox" />HTML+CSS<input type="button" value="删除" class="btn"/>li>
- ul>
- div>
-
- <div class="footer">
-
- <input type="checkbox" /> 已完成(0) / 总任务(4)
-
- <input type="button" value="清除所有任务" class="btn"/>
- div>
-
- div>
-
-
- body>
- html>
css:
- *{
- margin: 0px;
- padding: 0px;
- }
- li{
- list-style: none;
- }
- .main{
- width: 600px;
- margin: auto;
- }
- .btn{
- position: absolute;
- right: 0px;
- background: red;
- color: #fff;
- width: 90px;
- height: 33px;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- display:none;
- }
- /* 头部文件 */
- .header{
- border: 1px solid #999999;
- padding: 15px;
- }
- .header input{
- width: 100%;
- height: 40px;
- line-height: 40px;
- }
- /* list样式 */
- .list{
- border: 1px solid #999999;
- padding: 15px;
- margin-top: 15px;
- }
- .list li{
- height: 40px;line-height: 40px;color: #666;
- border-bottom: 1px solid #999999;
- position: relative;
- }
- .list li .btn{
- top:2px;
- }
-
- .list li:hover .btn{
- display: block;
- }
-
- /* 底部 */
- .footer{
- border: 1px solid #999999;
- padding: 15px;
- margin-top: 15px;
- position: relative;
- }
- .footer .btn{
- display: block;
- padding: 10px 20px;
- width: auto;
- height: auto;
- padding-bottom: 9px;
- top:6px;
- right: 5px;
- }
主要是项目的组件部分,这里又细分了头部Header、List 和 Footer三个vue子组件
1.1、App.vue
import Header from "./components/Header.vue";
import List from "./components/List.vue";
import Footer from "./components/Footer.vue";
export default {
name: 'App',
components:{
Header,
List,
Footer
},
}
*{
margin: 0px;
padding: 0px;
}
li{
list-style: none;
}
.main{
width: 600px;
margin: auto;
}
.btn{
position: absolute;
right: 0px;
background: red;
color: #fff;
width: 90px;
height: 33px;
border: none;
border-radius: 5px;
cursor: pointer;
display:none;
}
1.2、 Header.vue
export default{
name:'Header',
}
/* 头部文件 */
.header{
border: 1px solid #999999;
padding: 15px;
}
.header input{
width: 100%;
height: 40px;
line-height: 40px;
}
1.3、 List.vue
- Vue
- React
- Java
- HTML+CSS
export default{
name:'List',
}
/* list样式 */
.list{
border: 1px solid #999999;
padding: 15px;
margin-top: 15px;
}
.list li{
height: 40px;line-height: 40px;color: #666;
border-bottom: 1px solid #999999;
position: relative;
}
.list li .btn{
top:2px;
}
.list li:hover .btn{
display: block;
}
1.4、 Footer.vue
export default{
name:'Footer',
}
/* 底部 */
.footer{
border: 1px solid #999999;
padding: 15px;
margin-top: 15px;
position: relative;
}
.footer .btn{
display: block;
padding: 10px 20px;
width: auto;
height: auto;
padding-bottom: 9px;
top:6px;
right: 5px;
}
把样式中静态的数据化为动态的数据,在父组件App.vue里创建一个todo数组,包含列表数据;并把数组传给List.vue子组件里面去
name: 'App',
data(){
return {
todo:[
{id:1,name:'Vue',done:false},
{id:2,name:'React',done:false},
{id:3,name:'Java',done:true},
{id:4,name:'HTML+CSS',done:true},
]
}
},
这里的id 就是每一列数据的身份证,具有唯一性。便于后面的增添、删除、修改状态其他操作;done是为了修改状态属性,有true 和false 两个值
1. 用props接收数组
name:'List',
props:['todo'],
//测试是否拿到了todo数组的值
mounted(){
console.log(this.todo);
}
2. 遍历数组
List.vue
- <div class="list">
- <ul>
- <Item>Item>
- ul>
- div>
-
- <script>
- import Item from '../components/Item'
-
- export default{
- name:'List',
- props:['todo'],
- //测试是否拿到了todo数组的值
- mounted(){
- console.log(this.todo);
- },
- components:{
- Item,
- },
- }
- script>
-
- <style>
- /* list样式 */
- .list{
- border: 1px solid #999999;
- padding: 15px;
- margin-top: 15px;
- }
- .list li{
- height: 40px;line-height: 40px;color: #666;
- border-bottom: 1px solid #999999;
- position: relative;
- }
- .list li .btn{
- top:2px;
- }
-
- .list li:hover .btn{
- display: block;
- }
-
- style>
Item.vue
- <div>
- <li><input type="checkbox"/>vue<input type="button" value="删除" class="btn"/>li>
- div>
-
- <script>
- export default {
- name:'Item',
- }
- script>
-
- <style scoped>
-
- style>
此时列表里只有初始测试的值,数组的值还没有添加到Item的列表里
- {{item.name}}
export default {
name:'Item',
props:['item'],
}
1. 在头部组件里绑定一个enter键的键盘事件
methods:{
pressAdd(){
console.log('111');
}
},
2. 按下enter键后,能把输入框中的值添加到列表里去
App.vue中
methods:{
addTodo(name){
const item={id:new Date().getTime(),name,done:false};
this.todo.unshift(item);//数组的添加方法
//console.log('app',item);
},
},
Header.vue
props:['addTodo'],
methods:{
pressAdd(e){
this.addTodo(e.target.value);
//console.log('111');
}
},
App.vue
绑定新数组把值传递到list
:delTodo="delTodo" >
methods:{
addTodo(name){
const item={id:new Date().getTime(),name,done:false};
this.todo.unshift(item);
//console.log('app',item);
},
delTodo(id){
this.todo=this.todo.filter((item)=>{
return item.id!=id;
})
}
},
List.vue
再在list把值传递给item
- :delTodo="delTodo">
props:['todo','delTodo',],
Item.vue
添加点击删除事件,回调父组件里的函数,获取id值删除列表
- {{item.name}}@click="pressDel(item.id)"/>
props:['item','delTodo',],
methods:{
pressDel(id){
this.delTodo(id);//调用父组件回调函数 并传递id
}
}