router-routerview

1.2.1 • Public • Published

#This project is based on react and immutable-js.

Demo http://router-view.mvc-works.org/

##Initial idea

In time travelling debugger, router is not controlled. So I suggest location bar being regarded as a view of store in order to be controlled.

    // src/router/RouterView.js
    import React, { Component } from 'react'
    import {Switch,Route,Redirect} from 'react-router-dom'

    export default class RouterView extends Component {

        render() {

            let {routes}=this.props
            let isRedic=routes.filter((item)=>item.redirect)
            let Redic=isRedic.map((item,index)=>{
                return <Redirect key={index} from={item.path} to={item.redirect}></Redirect>
            })

            routes=routes.filter((item)=>!item.redirect)
            return (

                <Switch>
                    {
                        routes.map((item,index)=>{
                            return <Route key={index} path={item.path} render={(props)=>{
                                return <item.component routes={item.children} {...props}></item.component>
                            }}></Route>
                        })
                    }
                    {
                        Redic.length!==0 && Redic
                    }
                </Switch>

            )
        }
    }

##Notice keep in mind that router-view is totally based on immutable-js. if you need to route asynchronously, try set skipRendering to true during loading undefined value is eliminated on purpose, fire an issue if you think differenly.

    //src/router/routes.js

    import login from "../view/login";
    import main from "../view/main";

    const routes=[
        {
            path:'/',
            redirect:"/login"
        },
        {
            path:"/login",
            component:login
        },
        {
            path:"/main",
            component:main
        }   
    ]

    export default routes;

##About

router-routerview is a lightweight, extensive state based riot.js router for tag views. It was designed after the ui-router project, with all the quirks of riot.js.

This project makes use of the HTML5 history api, using pushState under the hood; in other words this is a client sided router.

    // src/App.js
    return (
      <BrowserRouter>
          <RouterView routes={routes}></RouterView>
      </BrowserRouter>
    )

//  src/component/islogin.js

import React,{Component} from 'react'
function islogin(Main){
    return class extends Component{
         state ={
              islogin:false
         }
         componentDidMount(){
             let token = localStorage.getItem("token")
             if(token){
                  this.setState({
                       islogin:true
                  })
             }else{
                 this.props.history.push('/login')
             }
         }
         render(){
            let {islogin} = this.state
            return islogin ? <Main {...this.props}></Main> : <div>loading...</div>
         }
    }
}

export default islogin

###jwt.sign({data},this.config.keys,{expiresIn:"4h"})

let { username, password } = this.state
axios.post("/login", { username, password }).then(data => {
      //get token
      let token = data.data.token;
      //localStorage token
      localStorage.setItem("token", token);
      //jump router
      this.props.history.push("/main");
    });

/server/app/controller/main.js

three list connet

This project makes use of the HTML5 history api, based on immutable-js. if you need to route asynchronously, try set skipRendering to true during loading undefined

async getInfo(){
        let {token} = this.ctx.request.body
        let data = jwt.verify(token,this.config.keys).res   //{ id: 1, identity: 'v0', username: 'super', password: '123' }
        let res ={identityId:data.identity}
        let {identity} =data  //  v0            
        let identityData = await this.app.mysql.get('identity',{id:identity})   //{ identity: 'SuperUser', id: 'v0', access: '1,2,3' }
        res.user=identityData.identity  // {user:SuperUser}
        let {access} =identityData   // '1,2,3'
        let sql = `select * from access where ${access.split(',').map(item=>`id=${item}`).join(" or ")}`
        let accessData =await this.app.mysql.query(sql)  
        console.log(accessData)
        res.btnList=accessData
        this.ctx.body=res
     }

/src/view/main.js

 //Click OK to judge whether the header is added or edited for different operations
    handleOk = () => {
        let { listname, listtel, title, editID } = this.state
        //add
        if (title === "add") {
            axios.post('/add', { listname, listtel }).then(res => {
                console.log(res)
            })
            this.setState({
                show: false,
            })
        // update 
        } else if (title === "update") {
            //phone /zhengze/
            let reg = /^1[3-5|7-8][0-9]{9}$/
            if (!reg.test(listtel)) {
                alert("write error")
                return
            }
            let obj = {
                name: listname,
                tel: listtel,
                id: editID
            }
            axios.post('edit', { obj }).then(res => {
                console.log(res)
                this.setState({
                    show: false
                })
            })
        }
        axios.get('/list').then(res => {
            console.log(res)
            this.setState({
                listData: res.data.listData
            })
        })
    }
    //show 
    show = () => {
        this.setState({
            show: true,
            title: "add",   //add tianjia jiekou
            listname: "",
            listtel: ""
        })
    }
    handleEdit = (item) => {
        this.setState({
            show: true,
            title: "update",
            listname: item.name,
            listtel: item.tel,
            editID: item.id
        })

    }


    componentDidMount() {
        let token = localStorage.getItem('token')
        //login User qx
        axios.post('/getInfo', { token }).then((res) => {
            console.log(res)
            this.setState({
                user: res.data.user,
                identityId: res.data.identityId,
                btnlist: res.data.btnList
            })
            if (res.data.user === "SuperUser") {
                this.setState({
                    add: true,
                    dels: true,
                    look: true,
                    edit: true
                })
            } else if (res.data.user === "User") {
                this.setState({
                    add: false,
                    dels: false,
                    look: true,
                    edit: true
                })
            } else if (res.data.user === "keren") {
                this.setState({
                    add: false,
                    dels: false,
                    look: true,
                    edit: false
                })
            }
        })
        //find shuju list
        axios.get('/list').then(res => {
            console.log(res)
            this.setState({
                listData: res.data.listData
            })
        })
    }

Readme

Keywords

none

Package Sidebar

Install

npm i router-routerview

Weekly Downloads

0

Version

1.2.1

License

ISC

Unpacked Size

8.12 kB

Total Files

3

Last publish

Collaborators

  • sinclair-nine