Data binding in React

前端 未结 12 772
心在旅途
心在旅途 2021-01-30 19:49

What I want to do is when I type some text in an input field, it should appear in another place realtime.

Below is my input;



        
相关标签:
12条回答
  • 2021-01-30 20:34

    Data binding in React can be achieved by using a controlled input. A controlled input is achieved by binding the value to a state variable and a onChange event to change the state as the input value changes.

    See the below snippet

    class App extends React.Component {
      constructor() {
        super();
        this.state = { value: 'Hello World' };
      }
      handleChange = (e) => {
        this.setState({ value: e.target.value });
      };
      render() {
        return (
          <div>
            <input
              type="text"
              value={this.state.value}
              onChange={this.handleChange}
            />
            <p>{this.state.value}</p>
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
    <div id="app"></div>


    Update: React Hooks

    Here is an equivalent function component of the class defined above.

    const { useState } = React;
    
    const App = () => {
      const [value, setValue] = useState('Hello World');
      const handleChange = (e) => setValue(e.target.value);
      return (
        <div>
          <input type="text" value={value} onChange={handleChange} />
          <p>{value}</p>
        </div>
      );
    };
    
    ReactDOM.render(<App />, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.14.0/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.14.0/umd/react-dom.production.min.js"></script>
    <div id="app"></div>

    0 讨论(0)
  • There are actually people wanting to write with two-way binding, but React does not work in that way.

    That's true, there are people who want to write with two-way data binding. And there's nothing fundamentally wrong with React preventing them from doing so. I wouldn't recommend them to use deprecated React mixin for that, though. Because it looks so much better with some third-party packages.

    import { LinkedComponent } from 'valuelink'
    
    class Test extends LinkedComponent {
        state = { a : "Hi there! I'm databinding demo!" };
    
        render(){
            // Bind all state members...
            const { a } = this.linkAll();
    
            // Then, go ahead. As easy as that.
            return (
                 <input type="text" ...a.props />
            )
        }
    }
    

    The thing is that the two-way data binding is the design pattern in React. Here's my article with a 5-minute explanation on how it works

    0 讨论(0)
  • 2021-01-30 20:38

    class App extends React.Component {
      constructor() {
        super();
        this.state = {value : ''}
      }
      handleChange = (e) =>{ 
        this.setState({value: e.target.value});
      }
      render() {
        return (
        <div>
            <input type="text" value={this.state.value} onChange={this.handleChange}/>
            <div>{this.state.value}</div>
        </div>
       )
      }
    }
    ReactDOM.render(<App/>, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
    <div id="app"></div>

    0 讨论(0)
  • 2021-01-30 20:38

    Don't need to Break head with setState() in react.js

    A new library made by me React-chopper

    Code Like angularjs in reactjs

    Code without setState in reactjs

    Go through examples for more description

    import React, { Component } from 'react';
    import { render } from 'react-dom';
    import Rcp from 'react-chopper';
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          name: 'React'
        };
        this.modal = Rcp(this.state, this);
      }
    
      tank = () => {
        console.log(this.modal)
      }
      render() {
        return (
          <div>
            <input value={this.modal.name} onChange={e => this.modal.name = e.target.value} />
            <p> Bang Bang {this.modal.name} </p>
            <button onClick={() => this.tank()}>console</button>
          </div>
        );
      }
    }
    
    render(<App />, document.getElementById('root'));
    

    Comments , Pr Are welcome ...Enjoy

    0 讨论(0)
  • 2021-01-30 20:39

    To bind a control to your state you need to call a function on the component that updates the state from the control's event handler.

    Rather than have an update function for all your form fields, you could create a generic update function using ES6 computed name feature and pass it the values it needs inline from the control like this:

    class LovelyForm extends React.Component {
      constructor(props) {
      alert("Construct");
        super(props);
        this.state = {
          field1: "Default 1",
          field2: "Default 2"
        };
      }
    
      update = (name, e) => {
        this.setState({ [name]: e.target.value });
      }
    
      render() {
        return (
          <form>
            <p><input type="text" value={this.state.field1} onChange={(e) => this.update("field1", e)} />
              {this.state.field1}</p>
            <p><input type="text" value={this.state.field2} onChange={(e) => this.update("field2", e)} />
              {this.state.field2}</p>
          </form>
        );
      }
    }
    ReactDOM.render(<LovelyForm/>, document.getElementById('example'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="example"></div>

    0 讨论(0)
  • 2021-01-30 20:40

    With the new feature called Hooks from the React team which makes functional components to handle state changes.. your question can be solved easily

    import React, { useState, useEffect } from 'react'
    import ReactDOM from 'react-dom';
    
    const Demo = props =>{
        const [text, setText] = useState("there");
        return props.logic(text, setText);
    };
    
    const App = () => {
        const [text, setText] = useState("hello");
    
        const componentDidMount = () =>{
            setText("hey");
        };
        useEffect(componentDidMount, []);
    
        const logic = (word, setWord) => (
            <div>
                <h1>{word}</h1>
                <input type="text" value={word} onChange={e => setWord(e.target.value)}></input>
                <h1>{text}</h1>
                <input type="text" value={text} onChange={e => setText(e.target.value)}></input>
            </div>
        );
        return <Demo logic={logic} />;
    };
    
    ReactDOM.render(<App />,document.getElementById("root"));
    
    0 讨论(0)
提交回复
热议问题