【问题标题】:React Checkbox from Postgres Database来自 Postgres 数据库的反应复选框
【发布时间】:2019-11-10 18:26:45
【问题描述】:

我从名为 users 的数据库表中获取一组用户。其中一个字段是默认值为 false 的复选框。我无法更改复选框。当我从静态页面获取数组时,它工作正常,但从数据库获取后无法工作。 handleChange 函数是我用来更改复选框的函数。从componentDidMount返回的数组是这样的:

{
 "id": 455,
    "firstname": "Sally",
    "lastname": "Sue",
    "company": "Baltic Explorations",
    "city": "houston",
    "phone": "2058231111",
    "email": "sally@gmail.com",
    "ischecked": false
},

App.js

class App extends Component  {

    constructor() {
    super()
    this.state = {
    network: [],
    networkfilter:[],
    suggest:suggest,
    searchfield:'',
    searchsuggest:'',
    route:'signin',
    routed:false,
    isSignedIn:false,
    user: {
      id:'',
      firstname: '',
      lastname: '',
      phone:'',
      city:'',
      email:'',
      company:'',
      ischecked:false

    }

}
this.handleChange=this.handleChange.bind(this);
this.handleClick=this.handleClick.bind(this);

}

componentDidMount() {
  fetch('http://localhost:3000/data')
  .then(response => response.json())
  .then(data => {

    this.setState({network:data})})


}

loadUser = (data) => {
  this.setState({user: {
      id:data.id,
      firstname: data.firstname,
      lastname: data.lastname,
      phone: data.phone,
      city:data.city,
      email:data.email,
      company:data.company,
      ischecked:data.ischecked


  }})
}

onSearchChange=(event)=> {
  this.setState({searchfield:event.target.value})

}

onSuggestChange=(event)=> {
  this.setState({searchsuggest:event.target.value})

}

handleChange(id,route) {

    const updatedNetwork = network.map(netw => {
      if (netw.id===id) {
        netw.ischecked = !netw.ischecked       
      }
      return netw
    })
    return {
      network:updatedNetwork

    } 
}

render() {
  const filteredNetwork = this.state.network.filter(netw => {
    return netw.lastname.toLowerCase().includes(this.state.searchfield.toLowerCase())
  })

  const filteredSuggestions = this.state.suggest.filter(sugg => {
    return sugg.location.toLowerCase().includes(this.state.searchsuggest.toLowerCase())

  })

  return (
    <div className = "tc">
    <Navigation 
      isSignedIn ={this.state.isSignedIn}
      onRouteChange={this.onRouteChange}
      routed={this.state.routed}
     /> 

    {
    this.state.route==='home' ?
      <div> 
      <h2 className = "ml6">All Network</h2> 
         <Searchbox 
          searchChange = {this.onSearchChange}
          onRouteChange = {this.onRouteChange}
          routed={this.state.routed}

          /> 
         <NetworkArray 
             network={filteredNetwork}
             handleChange = {this.handleChange} 
             handleClick ={this.handleClick} 
             selectedCard={this.state.suggest}
             onRouteChange = {this.onRouteChange} 


             />
      </div> 
     : (
      this.state.route==='mynetwork' ? (
        <div>
         <h2 className = "ml6">My Network</h2>
         <Searchbox searchChange = {this.onSearchChange}

           />
          }
          <MyNetworkArray
            handleChange = {this.handleChange}
            network = {filteredNetwork}

           />
          ... moreComponents loaded here removed for brevity
export default App;

卡片组件

import React from 'react';

const Card = (props) => {

    return(
        <div className = 'pointer bg-light-green dib br3 pa3 ma2 grow  shadow-5'
        onClick = {() => props.handleClick(props.id)}>

        <div>
            <h3>{props.name}</h3>
            <p>{props.company}</p> 
            <p>{props.phone}</p>
            <p>{props.email}</p>
            <p>{props.city}</p> 

         </div>
         <div> 
            My Network
            <input className ="largeCheckbox"
                type = "checkbox"
                checked={props.ischecked}
                onChange={()=> props.handleChange(props.id)}
                    /> 
            </div> 
         </div> 

        )
}

export default Card;

如何更新复选框,并且当用户登录时,它会跟踪特定用户选中的复选框?

【问题讨论】:

    标签: reactjs database postgresql checkbox knex.js


    【解决方案1】:
      handleChange(id, route) {
        const updatedNetwork = network.map(netw => {
          if (netw.id === id) {
            netw.ischecked = !netw.ischecked;
          }
          return netw;
        });
        return {
          network: updatedNetwork
        };
      }
    

    这应该会给你各种错误,因为network 是未定义的。您是否有可能使用全局值或导入值来提供虚拟服务器响应,然后忘记将其更改为组件状态?我希望看到对this.state.network 的引用。

    【讨论】:

    • 你是对的。这来自一个静态页面,我在顶部有这个: import {network} from './NetworkData';当我删除它时,我得到网络未定义。我正在尝试更改所有内容以更新数据库。
    • OK 太棒了,我现在可以使用 this.state 更改复选框。但我想最大的问题是我将如何更新数据库以显示用户登录时选中的复选框?我需要另一张桌子等吗?
    • 在不知道您当前如何存储数据的情况下,这有点难以判断。但是,我假设除了usersnetworks 之外,您还有某种users_networks 连接表?如果是这种情况,您的查询只会在用户每次选中一个框时向所述表添加另一行。如果没有,也许这就是你的下一步行动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多