Skip to content

createSource: source is not reactive when use props #659

Closed

Description

@weijarz

Describe the bug

Resources are not updated when use props as source.

To Reproduce

Playground

import { createSignal, Suspense, createResource, createEffect } from 'solid-js'
import { render } from 'solid-js/web'

const fetchUpperName = async (name: string) => {
  console.log('fetching', name)
  await new Promise(r => setTimeout(r, 1000))
  return name.toUpperCase()
}

function UpperName(props: { name: string }) {
  const [upperName] = createResource(props.name, fetchUpperName)
  createEffect(() => {
    console.log('name', props.name, upperName())
  })
  return <h1>Hello, {props.name} = {upperName}</h1>
}

export default function App() {
  const [name, setName] = createSignal('noname')
  const updateName = (name: string) => () => setName(name)

  return (
    <>
      <button onClick={updateName('Neo')}>Neo</button>
      <button onClick={updateName('Chris')}>Chris</button>
      <p>Name: {name()}</p>
      <Suspense fallback={<p>Loading</p>}>
        <UpperName name={name()} />
      </Suspense>
    </>
  )
}

render(() => <App />, document.getElementById("app"))

Expected behavior

When click top buttons, resources are not refetch.

Activity

  1. lxsmnsyc commented on Sep 19, 2021

    @lxsmnsyc
    Member

    You need to wrap it into a function, otherwise createResource wouldn't know that there's something to track with.

    const [upperName] = createResource(() => props.name, fetchUpperName)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions