You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中Todo组件无法渲染的问题排查求助

Hey there! Let's fix that Todo component not rendering issue you're stuck on. The root problem in your map function is super common with arrow functions—you’re using curly braces {} around the Todo component but not returning it, which means your callback is producing undefined for every todo item instead of the JSX you want to render.

Here are two simple fixes:

Fix 1: Add an explicit return statement

When you use curly braces with an arrow function, you have to explicitly return the value you want to render:

{this.state.todos.map(todo => {
  // Add this return line
  return (
    <Todo 
      onToggle={() => this.toggle(todo.id)} 
      onDelete={() => this.removeTodo(todo.id)} 
      todo={todo} 
      key={todo.id} 
    />
  )
})}

Fix 2: Use implicit return (cleaner for simple callbacks)

If you don’t need extra logic inside the map callback, ditch the curly braces and use parentheses instead—this lets the arrow function implicitly return the JSX element:

{this.state.todos.map(todo => (
  <Todo 
    onToggle={() => this.toggle(todo.id)} 
    onDelete={() => this.removeTodo(todo.id)} 
    todo={todo} 
    key={todo.id} 
  />
))}

Why this works:

Arrow functions behave differently based on syntax:

  • With () => {}: The curly braces define a function body, so you need to use return to send back a value.
  • With () => (): The parentheses let you directly return an expression (like your Todo component) without writing return.

Full corrected code snippet

I filled in the missing Todo component and cleaned up the logic to make sure everything works end-to-end:

import React from 'react';
import { TextInput, Button, StyleSheet, View, Text, ScrollView } from 'react-native';
import { Constants } from 'expo'

let id = 0;

// Completed Todo component
const Todo = ({ todo, onToggle, onDelete }) => {
  return (
    <View style={styles.todoItem}>
      <Text 
        style={{ 
          textDecorationLine: todo.completed ? 'line-through' : 'none',
          flex: 1,
          fontSize: 16
        }}
        onPress={onToggle}
      >
        {todo.text}
      </Text>
      <Button title="Delete" onPress={onDelete} />
    </View>
  );
};

class TodoApp extends React.Component {
  state = {
    todos: [],
    inputText: ''
  };

  toggle = (todoId) => {
    this.setState(prevState => ({
      todos: prevState.todos.map(todo => 
        todo.id === todoId ? {...todo, completed: !todo.completed} : todo
      )
    }));
  };

  removeTodo = (todoId) => {
    this.setState(prevState => ({
      todos: prevState.todos.filter(todo => todo.id !== todoId)
    }));
  };

  addTodo = () => {
    if (this.state.inputText.trim()) {
      this.setState(prevState => ({
        todos: [...prevState.todos, { id: id++, text: prevState.inputText, completed: false }],
        inputText: ''
      }));
    }
  };

  render() {
    return (
      <View style={styles.container}>
        <TextInput
          style={styles.input}
          value={this.state.inputText}
          onChangeText={text => this.setState({ inputText: text })}
          placeholder="Add a new todo..."
        />
        <Button title="Add Todo" onPress={this.addTodo} />
        <ScrollView style={styles.todoList}>
          {/* Fixed map function here using implicit return */}
          {this.state.todos.map(todo => (
            <Todo 
              onToggle={() => this.toggle(todo.id)} 
              onDelete={() => this.removeTodo(todo.id)} 
              todo={todo} 
              key={todo.id} 
            />
          ))}
        </ScrollView>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: Constants.statusBarHeight,
    paddingHorizontal: 16
  },
  input: {
    borderWidth: 1,
    borderColor: '#ccc',
    padding: 8,
    marginBottom: 16,
    borderRadius: 4
  },
  todoItem: {
    flexDirection: 'row',
    alignItems: 'center',
    padding: 12,
    borderBottomWidth: 1,
    borderBottomColor: '#eee'
  },
  todoList: {
    flex: 1
  }
});

export default TodoApp;

内容的提问来源于stack exchange,提问作者DCR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:40:40