美文网首页
三个demo随意感受一下jq、vue、react各自写法思路

三个demo随意感受一下jq、vue、react各自写法思路

作者: 桃花兰岛主 | 来源:发表于2020-06-26 19:00 被阅读0次

这里用最简单的例子让大家感受一下各种写法思路的不同。
todolist domo,有新增,有删除。需求都一样。


image.png

分别是jq、vue、react
jq:

<body>
    <input type="text" id='input' /><button id='add'>add</button>
    <ul id='list'>
    </ul>
    <script src="./node_modules/jquery/dist/jquery.min.js"></script>
    <script>
        $(function () {
            let globalData = {
                list: [{ id: 1, name: '做作业' }, { id: 2, name: '看电影' }]
            }
            //渲染list
            const renderList = (() => {
                const ul = $('ul')
                let str = ''
                globalData.list.forEach(item => {
                    str +=
                        `<li>
                            <span>${item.name}</span>
                            <button class="finish" data-id="${item.id}">完成</button>
                        </li>`
                })
                ul.html(str)
                //完成
                $('.finish').on('click', function (event) {
                    const id = $(this).attr('data-id');
                    globalData.list = globalData.list.filter(item => item.id != id);
                    renderList()
                })
            })
            renderList(list)
            //寻找最大的id
            const findMaxId = () => {
                let id = 0;
                globalData.list.forEach(item => {
                    if (item.id > id) id = item.id
                })
                return id
            }
            //新增
            $('#add').on('click', () => {
                const value = $('#input').val()//input框的值
                if (value !== '') {
                    globalData.list.push({ id: findMaxId()+1, name: value})
                    renderList()
                }
                $('#input').val('')//清空
            })
        })
    </script>
</body>

vue:
data里面用来存放数据,mothods里面是方法。
@方法。v-model双向绑定
vue-for循环
vue改变数据自己就会重新渲染。只要让data改变,页面就会改变。
vue偏模板写法

<template>
  <div>
      <input type="text" v-model="value"><button @click="add">add</button>
      <ul>
          <li v-for="item in list" :key="item.id">
          <span>{{item.name}}</span>
          <button class="finish" @click="finish(item.id)">完成</button>
        </li>
      </ul>
  </div>
</template>

<script>
export default {
    data(){
        return{
            value:'',
            list:[{ id: 1, name: '做作业' }, { id: 2, name: '看电影' }]
        }
    },
    methods:{
        findMaxId(){
            let id = 0;
            this.list.forEach(item => {
                if (item.id > id) id = item.id
            })
            return id
        },
        add(){
            this.list=[...this.list,{id:this.findMaxId()+1,name:this.value}]
            this.value=''
        },
        finish(id){
            this.list = this.list.filter(item => item.id !== id)
        }
    }
}
</script>

<style>

</style>

react:
useState是初始赋值
setxx改变状态。
class要写出className
方法就onxxx
{}里面写js代码,react偏js写法
单向数据流
通过onChange={handleChange}实现双向绑定
react是通过setxx来触发重新渲染

import React, { useState } from 'react';

export default function() {
  const [list, setList] = useState([{ id: 1, name: '做作业' }, { id: 2, name: '看电影' }])
  const [value, setValue] = useState("")
  //完成
  const finish = (id) => {
    const newList = list.filter(item => item.id !== id)
    setList(newList)
  }
  const handleChange=(e)=>{
    setValue(e.target.value)
  }
  const findMaxId = () => {
    let id = 0;
    list.forEach(item => {
      if (item.id > id) id = item.id
    })
    return id
  }
  //新增
  const add=()=>{
    if(value!==""){
      const newList=[...list,{id:findMaxId()+1,name:value}]
      setList(newList)
      setValue("")
    }
  }
  return (
    <div className="App">
      <input value={value} onChange={handleChange}/><button onClick={add}>add</button>
      <ul>
        {list.map(item => 
        <li key={item.id}>
          <span>{item.name}</span>
          <button className="finish" onClick={()=>finish(item.id)}>完成</button>
        </li>
        )}
      </ul>
    </div>
  );
}

todolist-jq:https://github.com/lanweipeng/todolist-jq
todolist-vue:https://github.com/lanweipeng/todolist-vue
todolist-react(hooks):https://github.com/lanweipeng/todolist-react

相关文章

网友评论

      本文标题:三个demo随意感受一下jq、vue、react各自写法思路

      本文链接:https://www.haomeiwen.com/subject/imvufktx.html