Reactjs React ref语法和组件作为纯函数
我用React编写了以下TodoApp:Reactjs React ref语法和组件作为纯函数,reactjs,Reactjs,我用React编写了以下TodoApp: <!DOCTYPE html> <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script> <script src="https://unpkg.com/react@15.3.2/dist/react.js"><
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
<script src="https://unpkg.com/react@15.3.2/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@15.3.2/dist/react-dom.js"></script>
<title>React! React! React!</title>
</head>
<body>
<div class="container">
<div id="container" class="col-md-8 col-md-offset-2"> </div>
</div>
<script type="text/babel">
console.clear();
const Title = () => {
return (
<div>
<div>
<h1>to-do</h1>
</div>
</div>
);
}
const TodoForm = ({addTodo}) => {
// Input Tracker
let input;
// Return JSX
return (
<div>
<input ref={node => {
input = node;
}} />
<button onClick={() => {
addTodo(input.value);
input.value = '';
}}>
+
</button>
</div>
);
};
const Todo = ({todo, remove}) => {
// Each Todo
return (<li onClick={() => {remove(todo.id)}}>{todo.text}</li>);
}
const TodoList = ({todos, remove}) => {
// Map through the todos
const todoNode = todos.map((todo) => {
return (<Todo todo={todo} key={todo.id} remove={remove}/>)
});
return (<ul>{todoNode}</ul>);
}
// Contaner Component
// Todo Id
window.id = 0;
class TodoApp extends React.Component{
constructor(props){
// Pass props to parent class
super(props);
// Set initial state
this.state = {
data: []
}
}
// Add todo handler
addTodo(val){
// Assemble data
const todo = {text: val, id: window.id++}
// Update data
this.state.data.push(todo);
// Update state
this.setState({data: this.state.data});
}
// Handle remove
handleRemove(id){
// Filter all todos except the one to be removed
const remainder = this.state.data.filter((todo) => {
if(todo.id !== id) return todo;
});
// Update state with filter
this.setState({data: remainder});
}
render(){
// Render JSX
return (
<div>
<Title />
<TodoForm addTodo={this.addTodo.bind(this)}/>
<TodoList
todos={this.state.data}
remove={this.handleRemove.bind(this)}
/>
</div>
);
}
}
ReactDOM.render(<TodoApp />, document.getElementById('container'));
</script>
</body>
</html>
这是否只是将addTodo传递给函数声明的组件,而不是作为props
,而仅仅是一个参数
const TodoForm=({addTodo})=>{
这是否正确?
addTodo
仅作为一个参数而不是作为props
?出现在下面的函数中
const TodoForm = ({addTodo}) => {
// Input Tracker
let input;
// Return JSX
return (
<div>
<input ref={node => {
input = node;
}} />
<button onClick={() => {
addTodo(input.value);
input.value = '';
}}>
+
</button>
</div>
);
};
const TodoForm=({addTodo})=>{
//输入跟踪器
让输入;
//返回JSX
返回(
{
输入=节点;
}} />
{
addTodo(输入值);
input.value='';
}}>
+
);
};
第一行是ES6中解构的一个例子
发生的事情是在const TodoForm=({addTodo})=>{
props获得对TodoForm组件的传递,该组件是无状态的,在props中,您将addTodo
作为一个道具,因此在我们提取的所有道具中addTodo
同样对于REF,也采用了回调方法。编写函数是ES6风格。这里的节点
是一个参数,它不包含任何括号,因为它是一个单独的参数,ES6为您提供了省略括号的灵活性。同样在{}
中,您拥有函数体
在代码中,节点引用DOM元素,并将其引用分配给已定义的变量input
。现在可以使用input
引用DOM,而不是将ref分配为
,然后将其引用为this.refs.myValue
我希望我能正确地解释它
阅读以下关于React ref回调方法的了解详细解释。假设我们有这个方法:
const TodoForm = (data) => {
const addTodo = data.addTodo //can be const myFunc = data.addTodo
// Input Tracker
...
作为增强功能,我们可以这样做:
const TodoForm = (data) => {
const {addTodo} = data //can be const {addTodo as myFunc} = data
// Input Tracker
...
再来一次!
作为增强功能,我们可以这样做:
//注意,我们直接移动了{addTodo}来替换数据
const TodoForm = ({addTodo}) => {
//can be ({addTodo: myFunc}) => {
// Input Tracker
...
const TodoForm = (data) => {
const {addTodo} = data //can be const {addTodo as myFunc} = data
// Input Tracker
...
const TodoForm = ({addTodo}) => {
//can be ({addTodo: myFunc}) => {
// Input Tracker
...