vue和react两家的对比之–表格-(增删查小demo)
这篇博客主要就是对比一下使用分别react和vue实现下面这个小demo ,这个案例实现起来可以清除的看到vue模板的优势,但是这个案例并不能说明vue就比react要好,vue很多东西都给你封装好了,你只需要去调用,这就可能写出来的东西比较死,但是react就不一样了,大部分实现还得靠自己写,虽然写起来没vue那么快,但是写的花样很多,很灵活,这个可以从我下面的代码中体现出来,这两个都是现在很火的框架,此案例仅供参考。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e501a2d73956be53e8f771dcf218e2a9.png)
vue
代码中使用了 bootstrap3,这个里面有一个需要注意的点是,这个模糊查询 v-for遍历时 in 后面是search函数的返回值,这个使用vue实现起来比较简单 ,,但是使用react相对"麻烦”很多 这个从代码长度上就可以看出来 vue 100行 react 170多行(我写的麻烦了–但是还是有必要的)😂 —vue 版本添加了修改功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- <script src="/vue.js"></script> -->
<script crossorigin="anonymous" integrity="sha512-YXLGLsQBiwHPHLCAA9npZWhADUsHECjkZ71D1uzT2Hpop82/eLnmFb6b0jo8pK4T0Au0g2FETrRJNblF/46ZzQ==" src="http://lib.baomitu.com/vue/2.6.12/vue.js"></script>
<!-- <link rel="stylesheet" href="./bootstrap.css"> -->
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div id="app">
<div class="panel panel-primary" style="width: 80%; margin: 10px auto;">
<div class="panel-heading">
<h3 class="panel-title">添加信息</h3>
</div>
<div class="panel-body form-inline">
<label>
ID:
<input type="number" class="form-control" v-model="id" />
</label>
<label>
NAME:
<input type="text" class="form-control" v-model="name" />
</label>
<input type="button" value="添加" class="btn btn-primary" @click="add" />
<label>
按照关键字搜索:
<input type="text" class="form-control" v-model="searchText" />
</label>
</div>
</div>
<table class="table table-bordered table-hover table-striped" style="width: 80%; margin: 0 auto;">
<thead>
<tr>
<th>序号</th>
<th>ID</th>
<th>NAME</th>
<th>CREATE_TIME</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in search()" :key="item.id">
<td>{{index + 1}}</td>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.create_time}}</td>
<td><a href="" @click.prevent="del(item.id)">删除
</a>
<button class="btn btn-primary btn" data-toggle="modal" data-target="#myModal" @click="update(item.id)" >
修改
</button>
</td>
</tr>
</tbody>
</table>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
<h4 class="modal-title" id="myModalLabel">
修改表单内容
</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" role="form">
<div class="form-group">
<label for="lastname" class="col-sm-2 control-label">name</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="lastname" v-model="updateName"
>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭
</button>
<button type="button" class="btn btn-primary" @click="submit" data-dismiss="modal">
提交更改
</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal -->
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
list: [
{ id: 1, name: '小张', create_time: new Date().toLocaleString() },
{ id: 2, name: '小李', create_time: new Date().toLocaleString() },
{ id: 3, name: '小王', create_time: new Date().toLocaleString() },
],
id: 'null',
name: null,
searchText:'',
updateId:'',
updateName:''
},
methods: {
add() {
let { list, id, name } = this
if (list.find(item => item.id === parseInt(id))) {
this.id = ''
return alert('id重复了')
}
if (!id || !name) {
return alert('不能为空')
}
list.push({
id,
name,
create_time: new Date().toLocaleString()
})
// console.log(new Date().toLocaleDateString() +' ' + new Date().toLocaleString());
this.id = ''
this.name = ''
},
del(id) {
const index = this.list.findIndex(item => item.id === id)
this.list.splice(index, 1)
},
search() {
return this.list.filter(item => {
if(item.name.includes(this.searchText)) {
return item
}
})
},
update(id) {
const arr = this.list.find(item => item.id === id)
this.updateId = arr.id;
this.updateName = arr.name
},
submit() {
const index = this.list.findIndex(item => item.id === this.updateId)
this.list[index].name = this.updateName
}
},
})
</script>
</body>
</html>
react
当然这个代码 我把这个小案例组件化了 分成了3个组件,这样无形间增加了大量的代码 ,react中这个父 子 组件之间 数据的交流并不是太方便,然后这里就使用了props在父子组件和兄弟组件之间传参。 里面组件之间交流 比较容易整迷了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../day1/js/react.development.js"></script>
<script src="../day1/js/react-dom.development.js"></script>
<script src="../day1/js/prop-types.js"></script>
<script src="../day1/js/babel.min.js"></script>
<link rel="stylesheet" href="./bootstrap.css">
</head>
<body>
<div id="app"></div>
<script type="text/babel">
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
list: [
{ id: 1, name: '小明', create_time: new Date().toLocaleString() },
{ id: 2, name: '小李', create_time: new Date().toLocaleString() },
{ id: 3, name: '小天', create_time: new Date().toLocaleString() },
],
searchText: ''
}
}
toSearch = (searchText) => {
this.setState({ searchText })
}
toDel = (a) => {
let { list } = this.state
const index = list.findIndex(item => item.id === a)
list.splice(index, 1)
this.setState({
list
})
}
toAdd = (info) => {
const { id, name, create_time } = info
let { list } = this.state
list.push({
id,
name,
create_time
})
this.setState({
list
})
}
render() {
const { searchText } = this.state
const { list } = this.state
return (
<div>
<Add toAdd={this.toAdd} toSearch={this.toSearch} list={list} />
<Table toDel={this.toDel} list={list} searchText={searchText} />
</div>
)
}
}
class Add extends React.Component {
state = {
searchText: ''
}
static propTypes = {
toAdd: PropTypes.func.isRequired,
toSearch:PropTypes.func.isRequired
}
add = () => {
const { list } = this.props
if (list.find(item => item.id === parseInt(this.idInput.value))) {
this.idInput.value = ''
return alert('id重复了')
}
if (!this.idInput.value || !this.nameInput.value) {
return alert('不能为空')
}
console.log(this.idInput.value, this.nameInput.value)
let info = {
id: this.idInput.value,
name: this.nameInput.value,
create_time: new Date().toLocaleString()
}
this.props.toAdd(info)
this.idInput.value = ''
this.nameInput.value = ''
}
handleChange = (event) => {
const searchText = event.target.value;
this.setState({ searchText });
this.props.toSearch(searchText)
}
render() {
return (
<div className="panel panel-primary">
<div className="panel-heading">
<h3 className="panel-title">添加信息</h3>
</div>
<div className="panel-body form-inline">
<label>
ID:
<input type="number" className="form-control" ref={input => this.idInput = input} />
</label>
<label>
NAME:
<input type="text" className="form-control" ref={input => this.nameInput = input} />
</label>
<input type="button" value="添加" className="btn btn-primary" onClick={this.add} />
<label>
按照关键字搜索:
<input type="text" className="form-control" value={this.state.searchText} onChange={this.handleChange} />
</label>
</div>
</div>
)
}
}
class Table extends React.Component {
static propTypes = {
toDel:PropTypes.func.isRequired,
list:PropTypes.array.isRequired,
searchText:PropTypes.string.isRequired
}
del = (a) => {
this.props.toDel(a)
}
search = () => {
const { searchText, list } = this.props
return list.filter(item => {
if (item.name.includes(searchText)) {
return item
}
})
}
render() {
let { list } = this.props
return (
<table className="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>序号</th>
<th>ID</th>
<th>NAME</th>
<th>CREATE_TIME</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{
this.search().map((item, index) => {
return (
<tr key={item.id}>
<td>{index + 1}</td>
<td>{item.id}</td>
<td>{item.name}</td>
<td>{item.create_time}</td>
<td><a href="" onClick={(e) => { e.preventDefault(); this.del(item.id) }}>删除</a></td>
</tr>
)
})
}
</tbody>
</table>
)
}
}
ReactDOM.render(<App />, document.getElementById('app'))
</script>
</body>
</html>