欢迎光临散文网 会员登陆 & 注册

antd,reactjs,nodejs,ajax实现重名验证,下拉框3级联动效果,联级选择【诗书画唱】

2021-05-09 19:45 作者:诗书画唱  | 我要投稿

前言:

坐了几乎一下午,一动不动地从下午1点写到晚上8点左右,几乎没有动过坐的位置,有时很佩服自己的耐心和毅力,我专栏还是很用心写的,求三连!只点赞和收藏也可以啊!我正在各方面不断自我改进和进化中......


单词:

cascade

目录:

例子

例子1:在Vscode中使用antd中的组件的方法(以表单组件举例)

滑动到该组件展示网页的最后面或直接CTRL+F搜索“API”关键字,之后查看API,含有说明的内容,方便我们使用

一般可改的是label,message的部分,name等的部分一般不改

FormZuJian.js

个人习惯写注释文件

index.js


例子2:reactjs+nodejs ajax实现重名验证,在例子1的基础上实现后(myapp_servlet_data)ajax传数据到http://localhost:6666这个网页,前台(myapp)接收数据,进行重名验证(暂时不连接数据库,以后连接数据库)


FormZuJian.js

index.js

serv2.js


重名验证用于注册,所以这里的代码中的提交按钮的"登录"文本建议读者们使用时更改成"注册"




例子3:reactjs+nodejs ajax实现省份城市县的下拉框联动效果,下拉框默认选中,使用antd。

可以把别人写好的3级联动组件化


Cascade.js


index.js


serv3.js


下拉框默认选中其实很容易,我HBuilder中写好的下拉框默认选择的组件,直接写到VScode中,成为组件,和上面一样的调用就可以了,如果想用Ajax,就把写死的数据改写成Ajax的部分的Mydata等等。



例子4:用onInput事件,ref和innerHTML实现的更好且更简洁的重名验证


ChongMingYanZheng.js

index.js

serv2.js(见例2)


例子

例子1:在Vscode中使用antd中的组件的方法(以表单组件举例)




自己选一个组件



自己在自己创建的自己命名的comp文件夹下创建自己命名的FormZuJian.js文件,也就是写组件相关的内容,自己把从Ant Design(个人习惯将Ant Design简称为antd)中复制的代码拷贝到FormZuJian.js文件中,自己进行如下的改写(注释和添加内容)。


//我添加的代码 START 

//用来使用Reactjs的React模块——> 
import React from 'react'; 
//npm install jquery --save 

//用来写Ajax的jquery模块——> 
import $ from 'jquery'; 
//我添加的代码 END



//我添加的代码 START
//自定义组件
class FormZuJian extends React.Component {
  render(){
    return <Demo />;
             
            }

}


//我添加的代码 END



//我添加的代码——>
export default FormZuJian;
输入npm start后按回车键

自动跳转到显示组件效果的网页:

成功调用组件

滑动到该组件展示网页的最后面或直接CTRL+F搜索“API”关键字,之后查看API,含有说明的内容,方便我们使用



一般可改的是label,message的部分,name等的部分一般不改




FormZuJian.js

个人习惯写注释文件


import { Form, Input, Button, Checkbox } from 'antd';


//我添加的代码 START


//用来使用Reactjs的React模块——>

import React from 'react';

//npm install jquery --save


//用来写Ajax的jquery模块——>

import $ from 'jquery';

//我添加的代码 END


const layout = {

  labelCol: {

    span: 8,

  },

  wrapperCol: {

    span: 16,

  },

};

const tailLayout = {

  wrapperCol: {

    offset: 8,

    span: 16,

  },

};


const Demo = () => {

  const onFinish = (values) => {

    console.log('Success:', values);

  };


  const onFinishFailed = (errorInfo) => {

    console.log('Failed:', errorInfo);

  };


  return (

    <Form

      {...layout}

      name="basic"

      initialValues={{

        remember: true,

      }}

      onFinish={onFinish}

      onFinishFailed={onFinishFailed}

    >

      <Form.Item

        label="用户名"

        name="username"

        rules={[

          {

            required: true,

            message: '请输入你的用户名!',

          },

        ]}

      >

        <Input />

      </Form.Item>


      <Form.Item

        label="密码"

        name="password"

        rules={[

          {

            required: true,

            message: '请输入你的密码!',

          },

        ]}

      >

        <Input.Password />

      </Form.Item>


      <Form.Item {...tailLayout} name="remember" valuePropName="checked">

        <Checkbox>记住我</Checkbox>

      </Form.Item>


      <Form.Item {...tailLayout}>

        <Button type="primary" htmlType="submit">

         登录

        </Button>

      </Form.Item>

    </Form>

  );

};


//我添加的代码 START

//自定义组件

class FormZuJian extends React.Component {

  render(){

    return <Demo />;

              

            }


}


//我添加的代码 END


//我添加的代码——>

export default FormZuJian;


//antd中的源码——>

// ReactDOM.render(<Demo />, mountNode);


index.js



/******************/


//目录——>

// reactjs必备源码部分

// 个人添加的导入antd.css的代码部分

// 个人添加的导入组件的代码部分


// 个人科普——>

// 个人注释:Dg是表格组件

// FormZuJian.js是表单组件

//个人总结的导入代码模板:import 自定义文件别名(一般我习惯和导入文件名统一) from  文件路径;

/******************/

//reactjs必备源码部分 START 

import React from 'react';

import ReactDOM from 'react-dom';

import './index.css';

//reactjs必备源码部分 END

//(Router是要自己写的路由的部分,暂时我不写和不用导入) START 

// import Router from './comp/Router';

//(Router是要自己写的路由的部分,暂时我不写和不用导入) END

//个人添加的导入antd.css的代码部分 START

import 'antd/dist/antd.css';

//个人添加的导入antd.css的代码部分 END


//个人添加的导入组件的代码部分 START

import MyTable from './comp/MyTable';

import Dg from './comp/Dg';

import FormZuJian from './comp/FormZuJian';

//个人添加的导入组件的代码部分 END


import reportWebVitals from './reportWebVitals';

ReactDOM.render(

  <FormZuJian />,

  document.getElementById('root')

);

// If you want to start measuring performance in your app, pass a function

// to log results (for example: reportWebVitals(console.log))

// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

reportWebVitals();


例子2:reactjs+nodejs ajax实现重名验证,在例子1的基础上实现后(myapp_servlet_data)ajax传数据到http://localhost:6666这个网页,前台(myapp)接收数据,进行重名验证(暂时不连接数据库,以后连接数据库)

serv2.js
重名验证用于注册,所以这里的代码中的提交按钮的"登录"文本建议读者们使用时更改成"注册"

Success: {username: "诗书画唱", password: "11", remember: true}



遇到的报错:

Error: Objects are not valid as a React child (found: object with keys {name, pwd}). If you meant to render a collection of children, use an array instead.

错误:对象作为反应子对象无效(找到:键为{name,pwd}的对象)。如果您打算呈现一个子集合,请改用数组。

先尝试在成功例子的表单中打印获取的数据:


例子2做了如下的改动,其余和例子1一样:



把data的内容改变了



突然发现从VScode中可以下载的一些插件还挺有用的

运行方法

FormZuJian.js

import { Form, Input, Button, Checkbox } from 'antd';


//我添加的代码 START


//用来使用Reactjs的React模块——>

import React from 'react';

//npm install jquery --save


//用来写Ajax的jquery模块——>

import $ from 'jquery';

//我添加的代码 END


const layout = {

  labelCol: {

    span: 8,

  },

  wrapperCol: {

    span: 16,

  },

};

const tailLayout = {

  wrapperCol: {

    offset: 8,

    span: 16,

  },

};


const Demo = () => {

  const onFinish = (values) => {

    console.log('Success:', values);

    //自己加入的代码 START

    //自己写过的错误代码: console.log(this.state.myData);


    $.ajax({

      url: 'http://localhost:8777/?callback=?',

      type: 'POST',

      dataType: 'jsonp',

      success: (data) => {

        // this.setState({

        //     myData: data

        // });

        let i = 1;

        console.log(data)

        data.map(o => {

          console.log("使用map遍历处理的data中的name的值:" + o.name);


          if (o.name == values.username) {

            i = i * 0;

          }

          else if (o.name != values.username) {

            i = i * 3;

          }


        });

        console.log('输入的用户名是' + values.username);

        console.log('输入的用户密码是' + values.password);

        console.log('是否记住:' + values.remember);


        // if( values.username==data.name){

        //   console.log('重名验证的结果是:你已经重名了');


        // }


        // if( values.username!=data.name){

        //   console.log('重名验证的结果是:你没有重名');


        // }


        console.log('i的值是' + i);

        if (i == 0) {


          alert('重名验证的结果是:你已经重名了');

          console.log('重名验证的结果是:你已经重名了');


        }


        if (i % 3 == 0 && i != 0) {


          alert('重名验证的结果是:你没有重名');

          console.log('重名验证的结果是:你没有重名');


        }

        if (i == 1) {

          alert('重名验证的结果是:你还没有输入内容!');

          console.log('重名验证的结果是:你还没有输入内容!');


        }


      }

    });


    //自己加入的代码 END

  };


  const onFinishFailed = (errorInfo) => {

    console.log('Failed:', errorInfo);

  };


  return (

    <Form

      {...layout}

      name="basic"

      initialValues={{

        remember: true,

      }}

      onFinish={onFinish}

      onFinishFailed={onFinishFailed}

    >

      <Form.Item

        label="用户名"

        name="username"

        rules={[

          {

            required: true,

            message: '请输入你的用户名!',

          },

        ]}

      >

        <Input />

      </Form.Item>


      <Form.Item

        label="密码"

        name="password"

        rules={[

          {

            required: true,

            message: '请输入你的密码!',

          },

        ]}

      >

        <Input.Password />

      </Form.Item>


      <Form.Item {...tailLayout} name="remember" valuePropName="checked">

        <Checkbox>记住我</Checkbox>

      </Form.Item>


      <Form.Item {...tailLayout}>

        <Button type="primary" htmlType="submit" >

          登录

        </Button>

      </Form.Item>

    </Form>

  );

};


//我添加的代码 START

//自定义组件

class FormZuJian extends React.Component {

  //用Ajax接收后台放到网页的数据的代码部分 START

  constructor() {

    super();

    this.state = {

      myData: []

    }

  }

  componentWillMount() {

    //当组件将要被挂载到页面时获取数据:

    // $.ajax({

    //     url: 'http://localhost:8777/?callback=?',

    //     type: 'POST',

    //     dataType: 'jsonp',

    //     success: (data) => {

    //         this.setState({

    //             myData: data

    //         });


    //         console.log(data)

    //     }

    // });

  }


  //用Ajax接收后台放到网页的数据的代码部分 END


  render() {

    return <Demo />;


  }


}

//自己写过的错误代码: <div><Demo />{this.state.myData}</div> ;


//我添加的代码 END


//我添加的代码——>

export default FormZuJian;


//antd中的源码——>

// ReactDOM.render(<Demo />, mountNode);



index.js



//目录——>

// reactjs必备源码部分

// 个人添加的导入antd.css的代码部分

// 个人添加的导入组件的代码部分

// 个人科普——>

// 个人注释:Dg是表格组件

// FormZuJian.js是表单组件

//个人总结的导入代码模板:import 自定义文件别名(一般我习惯和导入文件名统一) from  文件路径;

/******************/

//reactjs必备源码部分 START 

import React from 'react';

import ReactDOM from 'react-dom';

import './index.css';

//reactjs必备源码部分 END

//(Router是要自己写的路由的部分,暂时我不写和不用导入) START 

// import Router from './comp/Router';

//(Router是要自己写的路由的部分,暂时我不写和不用导入) END

//个人添加的导入antd.css的代码部分 START

import 'antd/dist/antd.css';

//个人添加的导入antd.css的代码部分 END


//个人添加的导入组件的代码部分 START

import MyTable from './comp/MyTable';

import Dg from './comp/Dg';

import FormZuJian from './comp/FormZuJian';

//个人添加的导入组件的代码部分 END


import reportWebVitals from './reportWebVitals';

ReactDOM.render(

  

  <FormZuJian />,

  document.getElementById('root')

);

// If you want to start measuring performance in your app, pass a function

// to log results (for example: reportWebVitals(console.log))

// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

reportWebVitals();

//可选择的组件

/* <Dg /> :表格组件*/

/*  <FormZuJian /> :表单组件*/


serv2.js





let http = require('http');

let url = require('url');

http.createServer(function(req,res){

    let ps = url.parse(req.url,true).query;

    const data = [

        {

          

            name: '三连',

            pwd: 666

        },

        {

           

            name: '关注',

            pwd:888

           

        },

        {

          

            name: '诗书画唱',

            pwd:999

        },

    ];

    res.end(ps.callback + '(' + JSON.stringify(data) + ')');

}).listen(8777);

console.log('http://localhost:8777');





例子3:reactjs+nodejs ajax实现省份城市的下拉框联动效果,下拉框默认选中,使用antd。

cascade

音译:开始可诶的

运行方法


例子3和例子2很多操作都相同

可以修改数据为中文和3级联动变成2级联动的方法

4级联动就是再往里面嵌套一层



可以把别人写好的3级联动组件化

运行2个服务器

Cascade.js

import { Cascader } from 'antd';

//我添加的代码 START


//用来使用Reactjs的React模块——>

import React from 'react';

//npm install jquery --save


//用来写Ajax的jquery模块——>

import $ from 'jquery';

//我添加的代码 END


/*我注释掉的源码 START


下面的内容改写到用了nodejs的后台的js文件中和前台中的Cascade.js级联选择组件(下拉框联动)对应。


const options = [

  {

    value: 'zhejiang',

    label: 'Zhejiang',

    children: [

      {

        value: 'hangzhou',

        label: 'Hangzhou',

        children: [

          {

            value: 'xihu',

            label: 'West Lake',

          },

        ],

      },

    ],

  },

  {

    value: 'jiangsu',

    label: 'Jiangsu',

    children: [

      {

        value: 'nanjing',

        label: 'Nanjing',

        children: [

          {

            value: 'zhonghuamen',

            label: 'Zhong Hua Men',

          },

        ],

      },

    ],

  },

];


我注释掉的源码 END*/


function onChange(value) {

  console.log(value);

}


//我添加的代码 START

class Cascade extends React.Component {

    //用Ajax接收后台放到网页的数据的代码部分 START

    constructor() {

      super();

      this.state = {

        myData: []

      }

    }

    componentWillMount() {

      $.ajax({

          url: 'http://localhost:8777/?callback=?',

          type: 'POST',

          dataType: 'jsonp',

          success: (data) => {

              this.setState({

                  myData: data

              });

  

              console.log(data)

          }

      });

    }

  

    //用Ajax接收后台放到网页的数据的代码部分 END

  

  

    render() {

      return <Cascader options={this.state.myData} onChange={onChange} placeholder="请选择" />;

  

    }

  

  }

 

export default Cascade;


  //我添加的代码 END


  //我注释掉的源码 START

// ReactDOM.render(

//   <Cascader options={options} onChange={onChange} placeholder="Please select" />,

//   mountNode,

// );

  //我注释掉的源码 END





index.js



// import React from 'react';

// import ReactDOM from 'react-dom';

// import './index.css';

// import App from './App';

// //导入Hello组件

// import ZuJianName1 from './comp/ZuJianName1';

// import reportWebVitals from './reportWebVitals';


// ReactDOM.render(

//   <ZuJianName1 />,

//   document.getElementById('root')

// );

// // If you want to start measuring performance in your app, pass a function

// // to log results (for example: reportWebVitals(console.log))

// // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

// reportWebVitals();


/******************/


//目录——>

// reactjs必备源码部分

// 个人添加的导入antd.css的代码部分

// 个人添加的导入组件的代码部分

// 个人科普——>

// 个人注释:Dg是表格组件

// FormZuJian.js是表单组件

//个人总结的导入代码模板:import 自定义文件别名(一般我习惯和导入文件名统一) from  文件路径;

/******************/

//reactjs必备源码部分 START 

import React from 'react';

import ReactDOM from 'react-dom';

import './index.css';

//reactjs必备源码部分 END

//(Router是要自己写的路由的部分,暂时我不写和不用导入) START 

// import Router from './comp/Router';

//(Router是要自己写的路由的部分,暂时我不写和不用导入) END

//个人添加的导入antd.css的代码部分 START

import 'antd/dist/antd.css';

//个人添加的导入antd.css的代码部分 END


//个人添加的导入组件的代码部分 START

import MyTable from './comp/MyTable';

import Dg from './comp/Dg';

import FormZuJian from './comp/FormZuJian';

import Cascade from './comp/Cascade';

//个人添加的导入组件的代码部分 END


import reportWebVitals from './reportWebVitals';

ReactDOM.render(

  

  <Cascade />,

  document.getElementById('root')

);

// If you want to start measuring performance in your app, pass a function

// to log results (for example: reportWebVitals(console.log))

// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

reportWebVitals();

/*可选择的组件

 <Dg /> :表格组件

<FormZuJian /> :表单组件

  <Cascade /> :联级选择(下拉框联动)组件

  

  */

serv3.js


let http = require('http');

let url = require('url');

http.createServer(function(req,res){

    let ps = url.parse(req.url,true).query;

    const data = [

        {

          value: '浙江',

          label: '浙江',

          children: [


            {

              value: '杭州',

              label: '杭州',

              children: [

                {

                  value: '富阳',

                  label: '富阳',

                },


                {

                  value: '临安',

                  label: '临安',

                },

              ],

            },


            {

              value: '丽水',

              label: '丽水',

              children: [

                {

                  value: '景宁',

                  label:  '景宁',

                },

              ],

            },


          ],

        },

        {

          value: '江苏',

          label: '江苏',

          children: [

            {

              value: '南京',

              label: '南京',

              children: [

                {

                  value: '高淳',

                  label: '高淳',

                },

              ],

            },

          ],

        },

      ];

    res.end(ps.callback + '(' + JSON.stringify(data) + ')');

}).listen(8777);

console.log('http://localhost:8777');

下拉框默认选中其实很容易,我HBuilder中写好的下拉框默认选择的组件,直接写到VScode中,成为组件,和上面一样的调用就可以了,如果想用Ajax,就把写死的数据改写成Ajax的部分的Mydata等等。

还可以给父组件加很多属性,state状态机等等,看个人需求吧,比较容易。



例子4:用onInput事件,ref和innerHTML实现的更好且更简洁的重名验证


ChongMingYanZheng.js


import React from 'react';

//npm install jquery --save

import $ from 'jquery';


class ChongMingYanZheng extends React.Component{

    constructor(){

        super();

        this.state={

            txt:'aa'

        }

    }

    componentWillMount(){

        this.vv=$.ajax({

            url:'http://localhost:8777/?callback=?',

            type:'POST',

            dataType:'jsonp',

            success:data=>{

                //console.log(data.msg);

                this.setState({

                    txt:data.name

                })

            }

        })

    }

    componentWillUnmount(){

        //当组件被卸载时,取消未完成的请求

        this.vv.abort();

    }

    change=()=>{

        this.vv=$.ajax({

                    url:'http://localhost:8777/',

                    type:'POST',

                    dataType:'jsonp',

                    success:(data) => {data.map(o=>{


                        console.log(o.name);

                        if(this.refs.in.value==o.name){

                            this.refs.div1.innerHTML='用户名已存在';

                        }

                        

                        

                        else  if(this.refs.in.value!=o.name&&this.refs.in.value!==""){

                            this.refs.div1.innerHTML='该用户名可用';

                        }


                        else  if(this.refs.in.value==""){

                            this.refs.div1.innerHTML='用户名不可以为空';

                        }

                    })}

                })

        

    }

    render(){

        return  ( <div><input type='text'onInput={this.change} ref='in' />

                        <div ref='div1' ></div>

        </div> )

    }

}


export default ChongMingYanZheng;





index.js




/******************/


//目录——>

// reactjs必备源码部分

// 个人添加的导入antd.css的代码部分

// 个人添加的导入组件的代码部分

// 个人科普——>

// 个人注释:Dg是表格组件

// FormZuJian.js是表单组件

//个人总结的导入代码模板:import 自定义文件别名(一般我习惯和导入文件名统一) from  文件路径;

/******************/

//reactjs必备源码部分 START 

import React from 'react';

import ReactDOM from 'react-dom';

import './index.css';

//reactjs必备源码部分 END

//(Router是要自己写的路由的部分,暂时我不写和不用导入) START 

import Router from './route';

//(Router是要自己写的路由的部分,暂时我不写和不用导入) END

//个人添加的导入antd.css的代码部分 START

import 'antd/dist/antd.css';

//个人添加的导入antd.css的代码部分 END


//个人添加的导入组件的代码部分 START

import MyTable from './comp/MyTable';

import Dg from './comp/Dg';

import FormZuJian from './comp/FormZuJian';

import Cascade from './comp/Cascade';

import Dg_axios from './comp/Dg_axios';

import ChongMingYanZheng from './comp/ChongMingYanZheng';

//个人添加的导入组件的代码部分 END


import reportWebVitals from './reportWebVitals';

ReactDOM.render(

  

  <ChongMingYanZheng/>,

  document.getElementById('root')

);

// If you want to start measuring performance in your app, pass a function

// to log results (for example: reportWebVitals(console.log))

// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

reportWebVitals();

/*可选择的组件

 <Dg /> :表格组件

<FormZuJian /> :表单组件

  <Cascade /> :联级选择(下拉框联动)组件

  <Dg_axios/>:是用了axios技术接收数据的用了antd的表格组件


serv2.js(见例2)

antd,reactjs,nodejs,ajax实现重名验证,下拉框3级联动效果,联级选择【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律