Code Monkey home page Code Monkey logo

Comments (8)

aleclarson avatar aleclarson commented on May 25, 2024 1

Another option is to add a getPageData helper so the strategy can decide whether to guard against overwriting. The page data object would be created if no page data exists yet.

const data = helpers.getPageData(pageId)
// overwrite
data.title = 'hello world'
// guard
data.title ||= 'hello world'

from vite-plugin-react-pages.

csr632 avatar csr632 commented on May 25, 2024

But If we let user to mutate the page data directly, the logic inside addPageData will be bypassed. We need addPageData to track which page data comes from which file.

from vite-plugin-react-pages.

aleclarson avatar aleclarson commented on May 25, 2024

We can use a Proxy for that.

from vite-plugin-react-pages.

csr632 avatar csr632 commented on May 25, 2024

I want to keep it react setState style instead of the vue proxy style. 🤣

from vite-plugin-react-pages.

aleclarson avatar aleclarson commented on May 25, 2024

Imperative APIs are more flexible and just as understandable. No point in boxing yourself in with a rigid API like setState, unless you have a really good reason for it. React's core team came up with setState because they wanted renders to use immutable data for "time slicing" purposes. We have no need for such complexity.

from vite-plugin-react-pages.

csr632 avatar csr632 commented on May 25, 2024

You have a point. The fileHandler API can be used like this:

function fileHandler(file, pagesData) {
  // ...
  const proxy = pagesData['page1'];

  proxy.runtimeData.main = filePath1;
  proxy.runtimeData.dataKey2 = filePath2;
  // Equivalent to proxy.runtimeData.main = filePath1
  proxy.runtimeData = filePath1;

  proxy.staticData.dataKey3 = 'staticData3';
  proxy.staticData.title = 'title1';
  // can read and overwrite
  if (proxy.staticData.title) {
    proxy.staticData.title = 'title1';
  }
  // Forbidden. Throw error
  proxy.staticData = 'data';
}

A edgeCase: If handler of file1 do proxy.staticData.dataKey1 = {} and then handler of file2 do
proxy.staticData.dataKey1.dataKey2 = 'data'. We should treat the whole proxy.staticData.dataKey1 is owned by file1.
In other words, we don't do deep tracking to keep it simple.

I can implement this.

from vite-plugin-react-pages.

aleclarson avatar aleclarson commented on May 25, 2024

While we could pass a pagesData object for every file, it seems inefficient, since not every file has its own page data. So I think helpers.getPageData makes more sense.

Maybe splitting them up into getRuntimeData and getStaticData is a better approach? Less proxy.runtimeData or proxy.staticData being repeated everywhere.

findPages: (root, { watchFiles, getRuntimeData, getStaticData }) =>
  watchFiles(root, globs, (file) => {
    const data = getRuntimeData(file) // Pass a file or pageId
    const staticData = getStaticData('pageId')

    // Edit to your heart's content.
    data.contributorList = ['...']
    staticData.title ||= 'Default title'
  })

Though, I suppose you can always destructure...

const { data, staticData } = getPageData('id')

from vite-plugin-react-pages.

csr632 avatar csr632 commented on May 25, 2024

Fixed by #19

from vite-plugin-react-pages.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.