为什么我们可以在函数 react 中使用任何 prop 名称而不明确提及?

Why we can use any prop name in function react without explicit mention?

我正在学习 mobX-state-tree,在他们的教程代码中,我看到了这个

const App = observer(props => (
  <div>
    <button onClick={e => props.store.addTodo(randomId(), "New Task")}>
      Add Task
    </button>
    {values(props.store.todos).map(todo => (
      <div key={todo.id}>
        <input
          type="checkbox"
          checked={todo.done}
          onChange={e => todo.toggle()}
        />
        <input
          type="text"
          value={todo.name}
          onChange={e => todo.setName(e.target.value)}
        />
      </div>
    ))}
  </div>
));

render(<App store={store} />, document.getElementById("root"));  //store???

我有点懵,哪里提到了store?为什么我们可以使用 store 作为道具,而不是 prop={store},例如,如果我将商店更改为其他内容,比如“abcxyz”,那么它会出错 Cannot read properties of undefined (reading 'todos')。那么为什么我们在这里有商店。请告诉我,非常感谢

他们的代码:https://codesandbox.io/s/310ol795x6?file=/index.js

他们的教程,这是选择 “进入 UI” : https://mobx-state-tree.js.org/intro/getting-started

你应该 post 你想做什么,但我认为你需要了解 javascript 对象的基础知识以及 React 的工作原理。

您可以使用任何名称作为道具。但是如果你选择prop={any object}。您必须在您的应用程序观察器中使用它:

const App = observer(props => (
  <div>
    <button onClick={e => props.prop.addTodo(randomId(), "New Task")}>
      Add Task
    </button>
    {values(props.prop.todos).map(todo => (

花括号内传递的值也可以是任何值,在这种情况下,它们将商店定义为

const store = RootStore.create({
  users: {},
  todos: {
    "1": {
      id: id,
      name: "Eat a cake",
      done: true
    }
  }
});

如果你使用

<App store={store} />

观察者内部的道具对象将是

{
  store: {
    users: {},
      todos: {
        "1": {
          id: id,
          name: "Eat a cake",
          done: true
        }
      }
  }
}

现在如果你使用

<App prop={store} />

观察者内部的道具对象将是

{
      prop: {
        users: {},
        todos: {
          "1": {
            id: id,
            name: "Eat a cake",
            done: true
           }
          }
      }
    }

如您所见,您不再拥有 属性 商店,因此如果您保留 props.store.todos,则 属性 商店未定义。

干杯。