vue和react两家的对比之--表格-(增删查小demo)

vue和react两家的对比之–表格-(增删查小demo)


这篇博客主要就是对比一下使用分别react和vue实现下面这个小demo ,这个案例实现起来可以清除的看到vue模板的优势,但是这个案例并不能说明vue就比react要好,vue很多东西都给你封装好了,你只需要去调用,这就可能写出来的东西比较死,但是react就不一样了,大部分实现还得靠自己写,虽然写起来没vue那么快,但是写的花样很多,很灵活,这个可以从我下面的代码中体现出来,这两个都是现在很火的框架,此案例仅供参考。
在这里插入图片描述

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">
                            &times;
                        </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>
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值