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;
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>
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>
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
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>
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
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>
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"));