乐趣区

前后端数据通信之FromData

所有向服务器提交的 HTTP 数据,其实都是一个表单

FromData 是一种容器,用于模拟表单,向服务器提交数据,有两种使用方法

  • 创建空白 FromData 对象,然后向其中添加数据
  • 将 <from> 标签直接转化为一个 FromData 对象

使用 FromData

注册一个用户:

async register(uName,uPwd){let fromData = new FormData();
    fromData.append('name',uName);
    fromData.append('pwd',uPwd);
    try {
      let res = await fetch('/api/adduser',{
        method:'POST',
        body:fromData
      })
  
      const {ok,err} = await res.json();
      if(ok){console.log('add user ok!')
      }else{console.log('add user fail!');
      }
    } catch (error) {console.log('error:',error)
    }
  }
  

上面的代码就简单介绍了 FromData 的第一种用法 (创建对象的方式),接下来针对 fetch 进行下简单的封装

封装 fetch

fetch.js

const BASEURL="http://localhost:3000/api"

export default async function(url,options){
    try {const res = await fetch(url,options);
        const {ok,error,data} = await res.json();
        if(ok){return data}else{console.error(error);
            throw new Error(error)
        }
    } catch (error) {throw error}
}

FromData+React+React-Redux 结合使用

注册用户,并显示用户列表:

Reg.js

import React, {Component} from 'react';
import {connect} from 'react-redux'
import fetchJson from '../fetch'
import {from} from '_rxjs@6.5.2@rxjs';
class Reg extends Component {async submit(){// let fromData = new FormData();
        // fromData.append('name',this.refs.name.value);
        // fromData.append('pwd',this.refs.password.value);
        let fromData = new FormData(this.refs.from1);
        let data = await fetchJson('/api/adduser',{
            method:'POST',
            body:fromData
        })
        this.props.add_user({
            name:this.refs.name.value,
            pwd:this.refs.password.value
        })
        this.refs.name.value = "";
        this.refs.password.value = "";
    }

    render() {
        return (
            <div>
                <from ref="from1">
                    用户:<input type="text" name="name" ref="name"/><br/>
                    密码:<input type="password" name="password" ref="password"/><br/>
                    <input type="button" value="注册" onClick={this.submit.bind(this)}/>
                </from>
            </div>
        );
    }   
}

export default connect((state,props) => Object.assign({},props,state),{add_user(user){
        return{
            type:'ADD_USERS',
            user
        }
    }
})(Reg);

Table.js

import React, {Component} from 'react';
import {connect} from 'react-redux'
import fetchJson from '../fetch'

class Table extends Component {constructor(){super();
    }
    async componentDidMount(){const data = await fetchJson('/api/userlist');
        this.props.init_users(data)
    }
    render() {
        return (
            <div>
                <table border="1" width="100%">
                  <thead>
                    <tr>
                        <th> 用户名 </th>
                        <th> 密码 </th>
                    </tr>
                  </thead>
                  <tbody>
                     {this.props.users.map(({...item},index)=>(<tr key={index}>
                                <td>{name}</td>
                                <td>{pwd}</td>
                            </tr>
                         ))
                     }
                  </tbody>  
                </table>
            </div>
        );
    }
}

export default connect((state,props) => Object.assign({},props,state),{init_users(users){
        return{
            type:'SET_USERS',
            users
        }
    }
})(Table);

App.js

import React, {Component} from 'react';
import Table from './components/Table'
import Reg from './components/Reg'
class App extends Component {render() {
    return (
      <div>
        <Reg/>
        <Table/>
      </div>
    );
  }
}

export default App;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {async} from 'q';
import {Provider} from 'react-redux'
import store from './store'
ReactDOM.render(<Provider store={store}>
       <App />     
    </Provider>, 
    document.getElementById('root')
    );

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

store.js

import {createStore,combineReducers} from 'redux'

function users(state=[],action){switch(action.type){
        case 'SET_USERS':
            return action.users
        case 'ADD_USERS':
            return [
                ...state,
                action.user
            ]

        default:
            return state
    }
}

export default createStore(combineReducers({users}))

总结:

  • 使用 FromData 创建对象,并 append 的方式适合小量数据,并不易变的操作
  • 使用 from 表单直接转换成 FromData 的方式更加灵活,可控
退出移动版